记录FFmpeg编译分析方法
- windows msys2 编译FFmpeg代码,添加libmp3lame第三方库,结果总是失败,分析原因,最终解决,记录思路。
- configure文件中报错,libmp3lame >= 3.98.3 not find,但是lib 头文件都已经放好了。
- 查看configure文件,6334行内容为:
enabled libmp3lame && require “libmp3lame >= 3.98.3” lame/lame.h lame_set_VBR_quality -lmp3lame $libm_extralibs
看不懂require这行是什么意思。 - 搜索require 发现configure中定义了此函数:
require(){
log require "$@"
name_version="$1"
name="${1%% *}"
shift
check_lib $name "$@" || die "ERROR: $name_version not found"
}
check_lib也是个函数
check_lib(){
log check_lib "$@"
name="$1"
headers="$2"
funcs="$3"
shift 3
disable $name
check_func_headers "$headers" "$funcs" "$@" &&
enable $name && eval ${name}_extralibs="\$@"
}
之后搜索相关的shell 指令规则,如"$@" “$1” "shift 3"是什么意思之类的,基本上看懂了,但是不知道如何修改。
- 那看看config.log中怎么描述的吧:
test_ld cc -lmp3lame
test_cc
BEGIN ./ffconf.7rl0uyGC/test.c
1 #include <lame/lame.h>
2 #include <stdint.h>
3 long check_lame_set_VBR_quality(void) { return (long) lame_set_VBR_quality; }
4 int main(void) { int ret = 0;
5 ret |= ((intptr_t)check_lame_set_VBR_quality) & 0xFFFF;
6 return ret; }
END ./ffconf.7rl0uyGC/test.c
cl.exe -D_ISOC99_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Dstrtod=avpriv_strtod -Dsnprintf=avpriv_snprintf -D_snprintf=avpriv_snprintf -Dvsnprintf=avpriv_vsnprintf -D_USE_MATH_DEFINES -D_CRT_SECURE_NO_WARNINGS -D_CRT_NONSTDC_NO_WARNINGS -D_WIN32_WINNT=0x0600 -DPIC -nologo -IE:/msys64/usr/local/include -c -Fo./ffconf.7rl0uyGC/test.o ./ffconf.7rl0uyGC/test.c
test.c
./compat/windows/mslink -nologo -out:./ffconf.7rl0uyGC/test.exe ./ffconf.7rl0uyGC/test.o mp3lame.lib
LINK : fatal error LNK1181: 无法打开输入文件“mp3lame.lib”
ERROR: libmp3lame >= 3.98.3 not found
哦原来是这样的,先写了个test.c,然后通过cl.exe编译,成test.o。
编译过后,再link mp3lame.lib成test.exe。
现在我们编译成obj文件对了,但是链接不对,也就是没找到mp3lame.lib
- 那我们新建一个test.c(我放在了ffbuild目录下),自己模拟configure的执行步骤。在link时候将参数修改
./compat/windows/mslink -nologo -out:./ffconf.7rl0uyGC/test.exe ./ffconf.7rl0uyGC/test.o /usr/local/libmp3lame.lib
发现成功了。 那么我们就解决如何将-libmp3lame替换成/usr/local/libmp3lame.lib,或者怎么能让mslink找到对应的库。 - mslink是什么?看到内部命令,最终发现其指向的是VS的link.exe,具体路径是:G:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64\link.exe 我们查看了一下选项,发现指定库路径是通过 /LIBPATH 实现的,例如/LIBPATH=/usr/local/lib。
- 所以我们试着修改configure文件6334行将 -lmp3lame $libm_extralibs 替换为-LIBPATH=/usr/local/local/lib/mp3lame.lib (-lm linux会用到,windows已经编译过了,所以不必须)发现依旧失败。
- 继续测试,6334行将 -lmp3lame $libm_extralibs 替换为/usr/local/local/lib/mp3lame.lib ,执行configure 发现通过了。
- make clean, make, make install。
- 测试,发现成功,happy。
总结
读懂configure,结合config.log,抓要点类似单元测试的思路,缩小范围,测试解决。