在 Msys2 for Visual Studio 中使用 x264 编译 ffmpeg 的静态库,但从未找到 libx



之前使用MSYS2和Visual Studio 2015 x64工具链将ffmpeg 4.2.2下载并编译为静态库。我想从VLC/VideoLan添加x264编解码器,并将其编译到静态库中。但是,运行 ffmpeg 配置会产生错误,指出"找不到 libx264"。

我在"/c/ThirdParty/opt/ffmpeg-4.2.2"处构建了没有 VideoLAN 的 x264 的 ffmpeg,并将"make install"安装到"/c/ThirdParty/opt/ffmpeg-4.2.2/ffmpeg_build"。

我正在使用以下步骤从源代码x264编译,并使用相同的VS2015工具链将其添加到ffmpeg构建中:

  1. 启动"VS2015 x64 Natice 工具命令提示符">
  2. 在该 VS2015 命令提示符下,运行"c:\msys64\msys2_shell.cmd -mingw64 -use-full-path">
  3. 在 MSYS2 shell 内部,运行"cd/c/ThirdParty/opt">
  4. git 克隆 http://git.videolan.org/git/x264.git
  5. 光盘 x264
  6. CC=cl ./configure --enable-static --prefix=/c/ThirdParty/opt/ffmpeg-4.2.2/ffmpeg_build --disable-cli
  7. 进行安装
  8. 光盘../ffmpeg-4.2.2
  9. PKG_CONFIG_PATH=/c/ThirdParty/opt/ffmpeg-4.2.2/ffmpeg_build/lib \ ./configure --prefix=./ffmpeg_build --toolchain=msvc --arch=x86_64 \ --target-os=win64 --extra-cflags=-MT --extra-cxxflags=-MT \ --extra-ldflags=-L/c/ThirdParty/opt/ffmpeg-4.2.2/ffmpeg_build/lib \ --启用-x86asm --启用-asm --启用静态 --禁用-共享 \ --disable-debug --enable-gpl --enable-avresample --enable-libx264

这些步骤有效,编译 x264 很好,但 ffmpeg 的配置的输出是"错误:找不到 libx264"。

我还尝试了使用这两行代替上述步骤 6 和 10 的变化:

  • CC=cl ./configure --enable-static --prefix=/usr/local --disable-cli
  • PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH ./configure --prefix=./ffmpeg_build --toolchain=msvc --arch=x86_64 --target-os=win64 --extra-cflags=-MT --extra-libs=/usr/local/lib/libx264.lib --extra-cxxflags=-MT --enable-x86asm --enable-asm --enable-static --disable-shared --disable-debug --enable-gpl --enable-avresample --enable-libx264

这个版本将通过配置,我可以在其中运行"make",但是在链接ffmpeg_g.exe时,make失败并出现一系列未解析的X264_*函数,总共有14个未解析的函数。底部显示的错误,但首先:

当我查看/c/ThirdParty/opt/ffmpeg-4.2.2/ffmpeg_build/lib 时,我看到:

$ ls -l ./ffmpeg_build/lib
total 50988
-rw-r--r-- 1 blake blake 27184250 May 11 16:29 libavcodec.a
-rw-r--r-- 1 blake blake   231304 May 11 16:29 libavdevice.a
-rw-r--r-- 1 blake blake  8574628 May 11 16:29 libavfilter.a
-rw-r--r-- 1 blake blake  8081930 May 11 16:29 libavformat.a
-rw-r--r-- 1 blake blake  1300118 May 11 16:29 libavutil.a
-rw-r--r-- 1 blake blake    61844 May 11 16:29 libpostproc.a
-rw-r--r-- 1 blake blake   348732 May 11 16:29 libswresample.a
-rw-r--r-- 1 blake blake  1316008 May 11 16:29 libswscale.a
-rw-r--r-- 1 blake blake  5086976 May 28 18:08 libx264.lib
drwxr-xr-x 1 blake blake        0 May 28 18:08 pkgconfig

同样,对于/c/ThirdParty/opt/ffmpeg-4.2.2/ffmpeg_build/lib/pkgconfig:

$ ls -l ./ffmpeg_build/lib/pkgconfig/
total 9
-rw-r--r-- 1 blake blake 353 May 11 16:29 libavcodec.pc
-rw-r--r-- 1 blake blake 554 May 11 16:29 libavdevice.pc
-rw-r--r-- 1 blake blake 449 May 11 16:29 libavfilter.pc
-rw-r--r-- 1 blake blake 393 May 11 16:29 libavformat.pc
-rw-r--r-- 1 blake blake 306 May 11 16:29 libavutil.pc
-rw-r--r-- 1 blake blake 317 May 11 16:29 libpostproc.pc
-rw-r--r-- 1 blake blake 322 May 11 16:29 libswresample.pc
-rw-r--r-- 1 blake blake 315 May 11 16:29 libswscale.pc
-rw-r--r-- 1 blake blake 300 May 28 18:08 x264.pc

在/usr/local/lib 中,我看到了 libx264.lib 和 pkgconfig 目录。

我最近的尝试生成的错误如下所示:

LD      ffmpeg_g.exe
libavcodec.a(libx264.o) : error LNK2019: unresolved external symbol __imp_x264_param_default referenced in function X264_init
libavcodec.a(libx264.o) : error LNK2019: unresolved external symbol __imp_x264_param_parse referenced in function X264_init
libavcodec.a(libx264.o) : error LNK2019: unresolved external symbol __imp_x264_param_default_preset referenced in function X264_init
libavcodec.a(libx264.o) : error LNK2019: unresolved external symbol __imp_x264_param_apply_fastfirstpass referenced in function X264_init
libavcodec.a(libx264.o) : error LNK2019: unresolved external symbol __imp_x264_param_apply_profile referenced in function X264_init
libavcodec.a(libx264.o) : error LNK2019: unresolved external symbol __imp_x264_picture_init referenced in function X264_frame
libavcodec.a(libx264.o) : error LNK2019: unresolved external symbol __imp_x264_encoder_open_160 referenced in function X264_init
libavcodec.a(libx264.o) : error LNK2019: unresolved external symbol __imp_x264_encoder_reconfig referenced in function reconfig_encoder
libavcodec.a(libx264.o) : error LNK2019: unresolved external symbol __imp_x264_encoder_headers referenced in function X264_init
libavcodec.a(libx264.o) : error LNK2019: unresolved external symbol __imp_x264_encoder_encode referenced in function X264_frame
libavcodec.a(libx264.o) : error LNK2019: unresolved external symbol __imp_x264_encoder_close referenced in function X264_close
libavcodec.a(libx264.o) : error LNK2019: unresolved external symbol __imp_x264_encoder_delayed_frames referenced in function X264_frame
libavcodec.a(libx264.o) : error LNK2019: unresolved external symbol __imp_x264_encoder_maximum_delayed_frames referenced in function X264_init
libavcodec.a(libx264.o) : error LNK2019: unresolved external symbol __imp_x264_levels referenced in function X264_init
ffmpeg_g.exe : fatal error LNK1120: 14 unresolved externals
make: *** [Makefile:111: ffmpeg_g.exe] Error 96

也许ffmpeg的配置的--extra-ldflags或--extra-libs选项有问题,但是在尝试了变体和谷歌搜索之后,我来问你。你知道这个ffmpeg配置行有什么问题吗?上面的步骤 10。

注释或删除 libavcodec\libx264.c 中的以下行:

#if defined(_MSC_VER)
#define X264_API_IMPORTS 1
#endif

这可能应该有助于解决您的unresolved external symbol错误。 至于原始项目 10 的错误,您为指向 lib dir 而不是 pkgconfig dir 的PKG_CONFIG_PATH设置了错误的值。

最新更新