关于ffmpeg交叉编译的一些坑

第一次做交叉编译,遇到了很多问题,查了很多资料,最后发现就真的只是路径问题。

报错提示:/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/5.3.0/real-ld: cannot find crt1.o: No such file or directory

先给出一个可用的configure方案:

./configure \
--enable-small \
--disable-programs \
--disable-avdevice \
--disable-encoders \
--disable-muxers \
--disable-filters \
--enable-cross-compile \
--cross-prefix=/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi- \
--enable-shared \
--disable-static \
--sysroot=${SDKTARGETSYSROOT} \
--extra-cflags="-fPIC --sysroot=${SDKTARGETSYSROOT} -mfloat-abi=hard" \
--extra-ldflags="-lrt -lm -ldl" \
--arch=arm \
--target-os=linux

顺便解释两个关键的地方:

${SDKTARGETSYSROOT} 就是sdk的sysroot,比如我用的是imx6的sdk,所以我引入环境后有了这个变量,如果你的交叉编译环境没有这个变量,也可以手动指定路径,像我的路径就是/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/cortexa7hf-neon-poky-linux-gnueabi,在sysroots下我有两个目录,一个是cortexa7hf-neon-poky-linux-gnueabi,还有一个是x86_64-pokysdk-linux,这两个有一个是板子的环境,还有一个是交叉编译器的工具集,而sysroot指的就是板子的环境,所以我应该把sysroot指定为cortexa7hf-neon-poky-linux-gnueabi而不是x86_64-pokysdk-linux,这个是我当时弄错的地方。

还有就是--cross-prefix=这个参数,它表示交叉编译工具的前缀,比如我的就是/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-,至于为什么结尾有-,那是因为完整的程序名是arm-poky-linux-gnueabi-gcc、arm-poky-linux-gnueabi-g++这样的,它们前面都遵循arm-poky-linux-gnueabi-这样的规则,所以写到这里configure已经能自动检测编译工具了。

清楚这两点,再去执行./configure,就没有报错了。当然,可能会有一个警告,但是我暂时先不管它,先看看编译出来能不能用。

下面简要展示一下我遇到问题的经过:

首先,我在网上随便找了一个ffmpeg的交叉编译教程,得到如上所示的configure格式——当然是有坑的,看ffbuild/config.log报错:/opt/fsl-imx-x11/4.1.15-2.1.0/sysroots/x86_64-pokysdk-linux/usr/libexec/arm-poky-linux-gnueabi/gcc/arm-poky-linux-gnueabi/5.3.0/real-ld: cannot find crt1.o: No such file or directory。也就是说,我找不到这个目标文件,根据网上的解释,就是路径的问题。但是我左想右想,没明白路径到底出了啥问题,直到我看了一个帖子:https://community.nxp.com/message/653148,突然想到,会不会是${SDKTARGETSYSROOT}跟我想的路径不一样呢?于是我打印出这个变量,果然,跟我之前设置的x86_64-pokysdk-linux是不一样的,正确的是cortexa7hf-neon-poky-linux-gnueabi,于是乎,问题就这样解决了。

解决问题前前后后可能都有差不多一个小时,所以查资料也是一门学问啊,不然很花时间的。记录一下,以后可能还会用得到,如果有人也有类似的问题,希望能看到这篇文章并有所帮助。

发表评论