在為一個視頻相關SDK添加h264編碼支持時,Android/iOS平台都進展都很順利,Windows想着也不不多,先編成靜態庫后扔Vistual Studio做鏈接,目標是最終都鏈接為一個動態庫。因為有現成的編譯shell腳本,開始嘗試用mingw編譯靜態庫,發現Vistual Studio鏈接時因為靜態庫依賴的 libgcc.a, libmingw.a, libmingwex.a 會與mscrt 有符號沖突,gcc和msvc兩套crt怎么可能不沖突。查看ffmpeg、x264官方有文檔說明都是支持使用 msvc 來編譯,這樣自然沒有 crt 版本不一致造成沖突的問題。
1. x264
按照官方文檔說明:
The following example command will configure libx264:
CC=cl ./configure --enable-static --prefix=<PREFIX> --extra-cflags="-DNO_PREFIX" make
The NO_PREFIX flag may be necessary to make linkable libraries.
執行方式:
- 要求VS 2013 SP2+
- 先執行 C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\Tools\VsDevCmd.bat
- 在切到 bash, [CC=cl] 使用 msvc 的編譯器, 其他和在linux/mac 編譯完全一樣
會編譯生成可用的靜態庫: libx264.lib
2. ffmpeg
使用的是最新3.0 版本,已經支持使用 msvc 工具鏈的編譯。只要指定toolchain為msvc,但生成的文件后綴不是.lib而是.a,沒關系,Virtual Studio 也是支持的。
#!/bin/bash set -x prefix=$(pwd)/win32/install export PKG_CONFIG_PATH="$prefix/lib/pkgconfig" mkdir -p win32/install cd ffmpeg if [[ ! -f config.mak ]]; then ./configure \ --toolchain=msvc \ --enable-gpl \ --enable-nonfree \ --enable-version3 \ --arch=x86 \ --target-os=mingw32 \ --pkg-config=pkg-config \ --disable-stripping \ --disable-everything \ --enable-static \ --disable-shared \ --disable-doc \ --enable-avresample \ --enable-demuxer=rtsp \ --enable-muxer=rtsp \ --disable-ffplay \ --disable-ffserver \ --enable-ffmpeg \ --disable-ffprobe \ --enable-libx264 \ --enable-encoder=libx264 \ --enable-decoder=h264 \ --enable-protocol=rtp \ --enable-hwaccels \ --enable-zlib \ --disable-devices \ --disable-avdevice \ --extra-cflags="-I$prefix/include -MT" \ --extra-ldflags=-L$prefix/lib \ --prefix=$prefix/ffmpeg fi make install
參考:https://trac.ffmpeg.org/wiki/CompilationGuide/MSVC