Ubuntu 18.04下编译Win32版本VLC 3.0.2失败求助
解决Ubuntu 18.04交叉编译Win32版VLC 3.0.2时的FAAD库符号未定义问题
我之前在交叉编译VLC到Win32架构时也碰到过一模一样的_imp____acrt_iob_func符号未定义问题,本质是MinGW-w64工具链的C运行时(CRT)版本不匹配导致的:你当前使用的预编译libfaad.a是用依赖UCRT(通用C运行时)的新MinGW版本编译的,但你的交叉编译环境里的工具链还在依赖旧的msvcrt,所以链接时找不到这个UCRT专属符号。用旧版FAAD库规避的话,又会因为缺少VLC 3.0.2依赖的LATM相关API(从错误里的latmAudioMuxElement函数能看出来)导致后续编译失败,下面是完整的解决步骤:
1. 先更新MinGW-w64工具链(Ubuntu 18.04默认版本偏旧)
Ubuntu 18.04官方源里的MinGW-w64版本可能不支持UCRT,先添加工具链PPA更新到兼容版本:
sudo add-apt-repository ppa:ubuntu-toolchain-r/test sudo apt-get update sudo apt-get upgrade gcc-mingw-w64-i686 g++-mingw-w64-i686
验证更新后的版本:
i686-w64-mingw32-gcc --version
确保版本在8.0以上,这个版本开始支持UCRT。
2. 重新编译匹配CRT的FAAD2(及其他VLC依赖)
问题出在预编译的contrib库版本不匹配,所以需要重新编译所有Win32 contrib库,指定使用UCRT:
- 先清理旧的contrib编译产物:
rm -rf contrib/i686-w64-mingw32
- 进入contrib目录并初始化编译脚本:
cd contrib ./bootstrap
- 运行Win32 contrib编译脚本,指定目标架构和UCRT:
../extras/package/win32/build-contrib.sh --host=i686-w64-mingw32 --with-win32-api=ucrt
这个过程会自动下载并编译所有VLC依赖(包括FAAD2),确保它们使用的CRT和你的工具链一致。
3. 重新运行configure脚本
现在用匹配的参数重新执行configure,确保和contrib的CRT设置一致:
../extras/package/win32/configure.sh --host=i686-w64-mingw32 --build=x86_64-pc-linux-gnu --with-win32-api=ucrt
这时候configure应该能顺利通过FAAD库的检查,不会再出现符号未定义的错误。
额外注意事项
- 如果编译contrib时出现依赖下载失败,可以手动下载对应的源码包放到contrib的
src目录下,脚本会自动识别并使用本地文件。 - 全程确保你的Ubuntu系统有足够的磁盘空间(至少20GB),交叉编译VLC和依赖需要较多存储。
内容的提问来源于stack exchange,提问作者user1547688
相关产品推荐
相关产品推荐

