aarch64 交叉编译

目的

在文章基于Xilinx zcu104版的petalinux编译(ffmpeg)中我介绍了如何在zcu104板上搭建操作系统,为了将海康威视摄像头拍摄下来的图像传输到zcu104板子PS的DDR处,我基于libavutil、libavformat、libavcodec这些库实现了自动抓取视频流中的关键帧并将它们存储为JPG格式(后续需要转换为YUV格式)的代码。

优雅的做法是在其他的平台上编译代码,在zcu104上只运行release版本,细心的同学应该已经看到在介绍搭建操作系统的那篇文章中并没有安装gcc库。代码在GCE上的虚拟机上交叉编译,使其可以在zcu104上安装的的操作系统上运行,zcu104对应的硬件架构是aarch64。

这时目标已经明确,在x86_64上交叉编译可以在aarch64架构上运行的代码,因为我已经将ffmpeg库安装进petalinux,所以在编译时所有库都可以动态链接。

步骤

  1. 安装交叉编译工具
    可以考虑使用linaro交叉编译套件,需要下载交叉编译工具交叉编译库,交叉编译库中有编译基本程序用到的链接库。

    如果按我这篇文章基于Xilinx zcu104版的petalinux编译(ffmpeg)安装了操作系统的话,则不需要下载交叉编译工具,仍然需要下载交叉编译库,之后在 petalinux的安装目录下执行source ./settings.sh即可,我这次用的交叉编译工具是aarch64-linux-gnu-gcc,可以通过输入aarch64-linux-gnu-gcc --version确认是否安装。

  2. 安装跨平台依赖库

    将下载下来的交叉编译库sysroot-glibc-linaro-2.25-2018.05-aarch64-linux-gnu重命名为sysroot,在sysroot下的usr是编译器的寻址路径。

    在x86_64 架构下的Linux平台编译代码,指令是gcc -o xxx xxx.c -lavutil -lavformat -lavcodec -lz -lpthread,因此需要交叉编译对应的库,比如ffmpeg等。为了不遗漏需要交叉编译的库,我们可以直接执行交叉编译指令aarch64-linux-gnu-gcc --sysroot=/path/to/sysroot -o xxx xxx.c -lavutil -lavformat -lavcodec -lz -lpthread,查看系统报错,看缺少那些库,之后只要对这些库进行交叉编译即可。

    安装了petalinux的同学可以直接将<project_dir>/build/tmp/sysroots-components/aarch64下相应的库拷贝进sysroot的路径下的usr目录的lib和include中。

  3. 交叉编译

    aarch64-linux-gnu-gcc --sysroot=/path/to/sysroot -o xxx xxx.c -lavutil -lavformat -lavcodec -lz -lpthread
    • –sysroot:编译器会自动在sysroot的路径下寻找文件夹中的usr目录下的lib和include。

总结

最后总结一下,交叉编译需要两步来完成,第一步是配置相应的交叉编译器,第二步是指定交叉编译器的寻找路径,来找到相应的库和头文件。

为了节省时间,我采用了比较naive的办法,如果大家有更好的办法,欢迎在我的githubsuikammd上提issue。

Author: suikammd
Link: https://suikammd.github.io/2019/04/27/aarch64-cross-compile/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.