在为一个视频相关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.0Common7ToolsVsDevCmd.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