用msys2与msvc编译FFmpeg

时间:2023-02-01 16:01:39

本文讲解如何使用 msys2 + msvc 来编译 FFmpeg ,msys2 的安装请看 ​​《MSYS2介绍》​​。

下面开始操作,先找到 x64 Native Tools Command Prompt for VS 2019 这个命令工具,点击它打开命令行,如下:

用msys2与msvc编译FFmpeg

这样打开的命令行 是有 vs2019 的环境变量的,如下图:

用msys2与msvc编译FFmpeg

千万不要用下面这种 win+R 的方式打开命令行,这样子打开命令行是没有 vs2019 的环境变量的。

用msys2与msvc编译FFmpeg

用msys2与msvc编译FFmpeg


为了让 msys2 能继承 vs2019 的环境变量,需要修改 ​​C:\msys64\msys2_shell.cmd​​ 中的 ​​rem set MSYS2_PATH_TYPE=inherit​​,去掉rem,取消这⼀句的注释。使MSYS2的环境变量继承当前CMD的窗口的环境变量。

提醒:FFmpeg-4.4.1 版本已经不需要 重命名 ​​C:/msys64/usr/bin/link.exe​​ 为 ​​C:/msys64/usr/bin/link.bak​​ , 避免和MSVC 的 link.exe 抵触。早期的版本可能需要。因为在 configure 里面编译的时候,调用的是 ./compat/window/mslink ,如下:

用msys2与msvc编译FFmpeg

./compat/window/mslink 代码
#!/bin/sh

LINK_EXE_PATH=$(dirname "$(command -v cl)")/link
if [ -x "$LINK_EXE_PATH" ]; then
"$LINK_EXE_PATH" $@
else
link.exe $@
fi
exit $?

上面是 mslink 的代码,可以看到,他的逻辑就是优先 使用 跟 cl.exe 同目录下的 link.exe。cl.exe 只有在vs2019 那里才有,C:/msys64/usr/bin 目录下没有 cl.exe,所以会优选使用 vs2019 里面的link.exe,所以不重命名 ​​C:/msys64/usr/bin/link.exe​​ 也没关系。


在 x64 Native Tools Command Prompt for VS 2019 命令窗口输入 ​​cd c:\msys64\​​ 先回到 msys64目录。

然后再输入 ​​.\msys2_shell.cmd -mingw64​​,启动 msys2 命令行窗口,如图:

提醒:​​-mingw64​​ 是指使用 64 位的 gcc 环境,但是本文不使用 gcc 编译器,用的是 MSVC 编译器。

由于上面使用 x64 打开的命令行窗口,所以使用的是 msvc 64 位的编译器,如果需要使用 32 位的 msvc ,要用 x86 Native Tools Command Prompt for VS 2019 打开 msys2 环境。

#回到 MSYS2 的安装目录
cd c:\msys64\
#启动 msys2 命令行
.\msys2_shell.cmd -mingw64

用msys2与msvc编译FFmpeg

在 msys2 命令行窗口 输入 ​​echo $LIB​​ ,可以看到 msys2 命令行窗口 已经继承了 vs2019 的 lib 环境变量。

用msys2与msvc编译FFmpeg

再输入一下 ​​which cl.exe​​ ,确认一下 cl.exe 是在vs2019的目录下,同时看下 cl.exe 的目录是否有 link.exe。

用msys2与msvc编译FFmpeg


MSYS2 + MSVC 环境已经准备好了,MSYS2 命令行已经继承了 vs2019 的环境变量,下面开始编译 FFmpeg。

1,上 Github 下载 ​​FFmpeg-n4.4.1.zip​​ 代码,放到 C:\msys64\home\loken\ffmpeg 目录,如下图:

用msys2与msvc编译FFmpeg

2,回到 msys2 命令行窗口,安装所需软件,命令如下:

pacman -S diffutils make pkg-config yasm

用msys2与msvc编译FFmpeg

3,进入 FFmpeg-n4.4.1 源码目录

cd /home/loken/ffmpeg/FFmpeg-n4.4.1

4,执行 configure ,如下:

./configure \
--prefix=/home/loken/ffmpeg/build64/ffmepg-4.4-msvc \
--enable-gpl \
--enable-nonfree \
--enable-shared \
--disable-optimizations \
--disable-asm \
--disable-stripping \
--toolchain=msvc

make -j8
# 要执行 make install
make install

5,编译完成之后,ffmepg-4.4-msvc 目录如下:

用msys2与msvc编译FFmpeg

用msys2与msvc编译FFmpeg

在 configure的时候 我故意使用了 --enable-shared 开启了编译动态库,所以生成了 一堆的 lib 跟 dll 文件。

上面的流程中,需要执行 make install, 因为 install 这个操作会把 exe 跟 dll 复制到同一个目录,这样才能运行。


这些 lib 跟 dll 都是可以被 MSVC 使用的,他们本身就是 msvc 编译出来的。具体试用,可以参考​​《用msys2与mingw编译FFmpeg》​​最后的 ffmpeg-test 的 version.exe 程序,使用方法是一样的。

相关阅读:

1,​​《官方MSVC编译FFmpeg》​