Search code examples
ffmpegconfiguremsys2libx264

Compiling static libs of ffmpeg with x264 in Msys2 for Visual Studio, but libx264 is never found


Having previously downloaded and compiled ffmpeg 4.2.2 to static libraries using MSYS2 and the Visual Studio 2015 x64 tool chain. I want to add the x264 codec from VLC/VideoLan, compiling that to a static library as well. However, running Configure for ffmpeg produces an error saying "libx264 not found."

I built ffmpeg without VideoLAN's x264 at "/c/ThirdParty/opt/ffmpeg-4.2.2" with "make install" installing to "/c/ThirdParty/opt/ffmpeg-4.2.2/ffmpeg_build" .

I am using the following steps to compile from source x264 and add it to the ffmpeg build using the same VS2015 tool chain:

  1. Launch an "VS2015 x64 Natice Tools Command Prompt"
  2. From that VS2015 command prompt, run "c:\msys64\msys2_shell.cmd -mingw64 -use-full-path"
  3. From inside the MSYS2 shell, run "cd /c/ThirdParty/opt"
  4. git clone http://git.videolan.org/git/x264.git
  5. cd x264
  6. CC=cl ./configure --enable-static --prefix=/c/ThirdParty/opt/ffmpeg-4.2.2/ffmpeg_build --disable-cli
  7. make
  8. make install
  9. cd ../ffmpeg-4.2.2
  10. 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 \ --enable-x86asm --enable-asm --enable-static --disable-shared \ --disable-debug --enable-gpl --enable-avresample --enable-libx264

The steps work, compiling x264 fine, but the output for ffmpeg's Configure is "ERROR: libx264 not found".

I have also tried the variation of using these two lines in place of steps 6 and 10 above:

  • 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

This version will get past Configure, where I am able to run "make", but the make fails with a series of unresolved X264_* functions while linking ffmpeg_g.exe, 14 unresolved functions in total. The errors at shown at the bottom, but first:

When I look in /c/ThirdParty/opt/ffmpeg-4.2.2/ffmpeg_build/lib I see:

$ 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

Likewise for /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

And looking in /usr/local/lib I see libx264.lib and the pkgconfig directory.

The errors generated by my most recent attempts look like:

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

Maybe something wrong with the --extra-ldflags or --extra-libs options of ffmpeg's Configure, but after trying variations and google searching, I come asking you. Do you know what is wrong with this ffmpeg Configure line? Step 10, above.


Solution

  • Comment or remove this lines in libavcodec\libx264.c:

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

    This probably should help with your unresolved external symbol errors. As for errors with original item 10 than you set wrong value for PKG_CONFIG_PATH pointing to lib dir instead of pkgconfig dir.