您的位置:首页 > 运维架构 > 网站架构

NDK r12b下编译安卓FFmpeg arm64架构出现的奇葩问题

2017-09-10 23:09 447 查看
FFmpeg编译执行脚本sh执行生成其静态库 .a 文件,一路顺风,没出现任何问题;但在静态库打包入动态库so文件的时候报错。折腾了三个小时;最终解决。这里做下记录防止后面忘记。首先贴上静态库打包动态库so的脚本:

function build_one_lite {
echo -e "\033[32m Starting build one lite for $ARCH and cpu-$CPU \033[0m"
cd ffmpeg
${LD} -rpath-link=$PLATFORM/usr/lib -L$PLATFORM/usr/lib -L$PREFIX/lib -soname $SONAME -shared -nostdlib -z noexecstack -Bsymbolic
--whole-archive --no-undefined -o $OUT_LIBRARY -lavcodec -lavformat -lavutil -lswresample -lswscale -lfastvox -lc -lm -lz -ldl -llog
--dynamic-linker=/system/bin/linker -zmuldefs $PREBUILT/lib/gcc/$EABIARCH/4.9.x/libgcc.a
cd ..
echo -e "\033[32m FINISHED build one lite $ARCH and cpu-$CPU \033[0m"
}


出现的错误:
/usr/local/android/ndk/r12b/toolchains/aarch64-linux-android-4.9/prebuilt/linux-x86_64/bin/aarch64-linux-android-ld skipping incompatible......
cannot find libavutil.a

查阅路径,libavutil.a存在的呀,怎么会说找不到呢,郁闷了半天,各种检查想到底哪里出错;期间忽略了一个重要的提示,那就是skipping incopatible 文字,报这样错误的问题实质是链接库文件时,库文件版本与平台版本不对应的问题;

OK 解决办法:

1、用以下命令查看该静态库文件的版本信息,是32位的还是64位的

objdump -p libavutil.a执行命令后显示结果:
[root@localhost lib]# objdump -p libavutil.a
In archive libavutil.a:

strtod.o: file format elf32-little

cpu.o: file format elf64-little

float_dsp_init.o: file format elf64-little

float_dsp_neon.o: file format elf64-little

adler32.o: file format elf64-little

aes.o: file format elf64-little

aes_ctr.o: file format elf64-little
2、请仔细看第一条,很重要
strtod.o:     file format elf32-little

看到他,他妈神奇了,牛逼了,咋执行arm64的命令还能生成32位的???就是这个32位的导致链接失败!!!!!

3、好了,那到底是什么原因的,又百度、又google,可能他妈前几次关键词没搜对,浪费了好长时间;

后来我直接IDE里全局搜索找到了strtod.d和 strtod.o文件,并且这个文件还提交到了svn,想了想不对,这个文件应该是编译时自动生成的,不应该提交到svn呀,哦,答案出来了,FFmpeg在编译时,如果strtod.c文件已编译,那就略过,(不会自动clean 这两个文件),导致我在编译arm64的时候,还是使用的32位的arm架构的strtod.d和 strtod.o文件。

4、至此解决办法大家都知道了吧,不要手动清楚,最好是写一个脚本,在编译各个cpu架构的版本前执行清理操作;

cd ffmpeg/compat
rm -rf strtod.d
rm -rf strtod.o
cd ../../
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ffmpeg ndk android ndk