ffmpeg+x264 Windows MSVC 静态编译
在为一个视频相关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