用MinGW和MSVC工具链编译FFmpeg静态链接库

最近在写的一个工程里面需要用到FFmpeg的静态链接库,
但是FFmpeg官方只提供动态库和源代码。
于是,本着自己动手丰衣足食和顺带提高自己的姿势水平的想法,
我自己编译了一份FFmpeg的静态链接库,并在此记录过程,供参考。

首先说说为什么需要MinGW环境:
FFmpeg工程采用的是Linux上典型的configure + make的方式来进行工程管理的, 而configure是Linux Shell脚本,Windows无法直接执行,这就需要MinGW提供的sh来解释执行了。

但是,同时采用MSVC工具链和MinGW环境会有一个比较大的矛盾:
1. 如果采用用vcvarsall.bat初始化的普通的Windows命令行,那么就无法执行configure来配置make;
2. 如果采用了MinGW的MinTTY进行编译,那就无法用vcvarsall.bat初始化MSVC工具链环境,导致configure找不到MSVC环境。

对此,网上有人提供的办法是,在msys.bat的开头CALL一下vcvarsall.bat,但是新版msys貌似不领情:在开头如果调用vcvarsall.bat,MinTTY会直接闪退。

所以,我自己想了个办法:
先用vcvarsall.bat初始化MSVC工具链环境,再直接调用MinGW里面的sh加载configure。
就像这样(我已经将他们加入了环境变量,方便使用):

E:\FFmpeg-n4.1.4>vcvars32
**********************************************************************
** Visual Studio 2017 Developer Command Prompt v15.9.12
** Copyright (c) 2017 Microsoft Corporation
**********************************************************************
[vcvarsall.bat] Environment initialized for: 'x86'

E:\FFmpeg-n4.1.4>sh ./configure [parameters]
...

这样一来,这个问题便迎刃而解了。

其次,configure的参数也非常重要,我前几次编译的时候参数没有调对,费了不少功夫……

E:\FFmpeg-n4.1.4>sh ./configure --target-os=win32 --disable-debug --enable-static --prefix=./vs2017_build_static --toolchain=msvc

如果configure提示"./configure: cmp: command not found",请在MSYS里安装diffutils。

如果一切正常,在configure执行完毕后,可以将根目录中的config.h转换为UTF-8编码,要不然CL在编译的时候会持续提示编码有问题。在一切准备妥当之后,我们就可以执行期待已久的make了。

E:\FFmpeg-n4.1.4>make

在编译过后,在每个对应文件夹中会生成.a文件,此时这些文件已经可以进行链接了。
如果你有强迫症,可以将开头的lib去掉,将其扩展名改为.lib。

至此,FFmpeg的编译过程就结束了。
编译出来的库可能依赖下列项目,不引用这些的话会爆LNK2001或者LNK2019:

#pragma comment(lib, "bcrypt.lib")
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "secur32.lib")
#pragma comment(lib, "gdi32.lib")
#pragma comment(lib, "version.lib")
#pragma comment(lib, "imm32.lib")
#pragma comment(lib, "setupapi.lib")
#pragma comment(lib, "strmiids.lib")
#pragma comment(lib, "quartz.lib")
#pragma comment(lib, "vfw32.lib")
文章作者: wxx9248
文章链接: https://blog.wxx9248.tk/2019/07/25/Compile-FFmpeg-Static-Library-with-MSVC-Toolchain-and-MinGW/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 wxx9248 的博客