升级FFmpeg至3.4.2后用NDK r16编译出现链接无效字符错误
我刚看到你升级FFmpeg版本后遇到的链接错误,这种.so文件开头出现无效字符的情况,大概率是编译过程中生成的库文件出了问题——它不是标准的二进制ELF格式,可能是脚本输出错误、编译参数冲突或者旧文件残留导致的。下面是几个我实战中常用的排查和修复步骤:
检查库文件的实际内容
先确认这个libswresample.so是不是真的损坏了,用命令查看文件开头的二进制内容:hexdump -n 100 /shared/dev/libs/ffmpeg/3.4.2/lib/android-x86/libswresample.so如果输出不是以
7f 45 4c 46(ELF文件的魔数)开头,而是出现了文本字符,那肯定是编译时把日志或错误信息误写入了库文件里。这时候要仔细检查你的编译脚本,确保所有输出重定向(比如>)都指向日志文件,而不是库文件的输出路径。彻底清理后重新编译
升级版本时,旧的编译残留很容易干扰新库的生成。先执行:make clean rm -rf /shared/dev/libs/ffmpeg/3.4.2/lib/android-x86/把旧的输出目录完全删掉,再重新运行编译脚本。这样能确保从头生成一套干净的库文件,避免残留文件导致的奇怪问题。
验证NDK与编译参数的兼容性
FFmpeg 3.4.2对NDK toolchain有一定要求,你用的x86-4.9理论上兼容,但要检查编译参数是否正确:- 确认
--cross-prefix设置为i686-linux-android-,没有拼写错误; --target-os设为android,--arch设为x86;- 如果之前编译静态库正常,这次编译动态库出问题,可以先尝试
--disable-shared编译静态库测试,排除动态库生成逻辑的问题。
- 确认
检查文件权限与完整性
有时候文件系统权限不足会导致库文件写入不完整,生成损坏的文件。确认编译用户对输出目录有读写权限,且编译过程中没有中途中断或出现报错。也可以用file命令验证文件类型:file /shared/dev/libs/ffmpeg/3.4.2/lib/android-x86/libswresample.so正常输出应该是
ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked, not stripped,如果不是,说明文件确实损坏,需要重新编译。
内容的提问来源于stack exchange,提问作者Jordan

