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

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 ../../


  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值