windows msys64 ffmpeg 编译libmp3lame错误解决思路

记录FFmpeg编译分析方法

  • windows msys2 编译FFmpeg代码,添加libmp3lame第三方库,结果总是失败,分析原因,最终解决,记录思路。
  1. configure文件中报错,libmp3lame >= 3.98.3 not find,但是lib 头文件都已经放好了。
  2. 查看configure文件,6334行内容为:
    enabled libmp3lame && require “libmp3lame >= 3.98.3” lame/lame.h lame_set_VBR_quality -lmp3lame $libm_extralibs
    看不懂require这行是什么意思。
  3. 搜索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"是什么意思之类的,基本上看懂了,但是不知道如何修改。

  1. 那看看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

  1. 那我们新建一个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找到对应的库。
  2. mslink是什么?看到内部命令,最终发现其指向的是VS的link.exe,具体路径是:G:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\bin\amd64\link.exe 我们查看了一下选项,发现指定库路径是通过 /LIBPATH 实现的,例如/LIBPATH=/usr/local/lib。
  3. 所以我们试着修改configure文件6334行将 -lmp3lame $libm_extralibs 替换为-LIBPATH=/usr/local/local/lib/mp3lame.lib (-lm linux会用到,windows已经编译过了,所以不必须)发现依旧失败。
  4. 继续测试,6334行将 -lmp3lame $libm_extralibs 替换为/usr/local/local/lib/mp3lame.lib ,执行configure 发现通过了。
  5. make clean, make, make install。
  6. 测试,发现成功,happy。
总结
读懂configure,结合config.log,抓要点类似单元测试的思路,缩小范围,测试解决。
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在Windows下使用MSYS2编译FFmpeg,你可以按照以下步骤进行操作: 1. 首先,下载FFmpeg的源代码。你可以在官方网站上找到下载链接。 2. 安装MSYS2 MinGW64。你可以在官方网站上找到安装程序。 3. 在MSYS2 MinGW64的命令行中,执行以下命令来配置编译环境和编译FFmpeg: ``` pacman -S mingw-w64-x86_64-toolchain // 安装mingw工具链 pacman -S msys/base-devel // 安装基础工作环境 pacman -S yasm nasm gcc // 安装汇编和编译器 pacman -S mingw64/mingw-w64-x86_64-SDL2 // 安装FFmpeg依赖的SDL2库 ``` 4. 解压下载的FFmpeg源码,并进入解压后的文件夹。使用以下命令进行配置和编译安装: ``` cd /path/to/ffmpeg-source-code // 进入FFmpeg源码文件夹 ./configure --prefix=/usr/local/ffmpeg // 配置安装路径 make // 编译源码(需要一段时间) make install // 安装编译结果 ``` 5. 编译完成后,你就可以在指定的安装路径(默认为/usr/local/ffmpeg)找到生成的相关文件。 请注意,编译过程中可能会出现一些错误。如果遇到问题,你可以参考一些博客或文档,或者重新安装MSYS2并重复上述步骤来解决问题。 希望这些步骤对你有帮助!<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [windows使用MSYS2编译FFmpeg](https://blog.csdn.net/ice_bear221/article/details/128515239)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值