在Windows上用MSYS2+msvc编译FFmpeg

摘要

本文描述了如何在Windows上通过MSYS2结合msvc工具链编译FFmpeg项目源码。

序言

在Linux平台上,编译FFmpeg项目源码是十分简单的,就是configure、make、make install三板斧。在Windows平台上,编译FFmpeg可以和Linux环境下一样简单,前提是要先安装一个能仿真Linux的shell进程环境的程序。这类仿真程序有很多,比如Cygwin、MSYS、MinGW、MSYS2等。前面的几种已经略显过时了,作者采用的是MSYS2环境,它既有自己原生的MSYS环境,也能模仿mingw32、mingw64、clang64、ucrt64环境。

MSYS2安装

访问https://www.msys2.org/,下载msys2-x86_64-*.exe安装包。

执行安装包,安装到默认路径,一般是c:\msys64\目录。

MSYS2采用pacman命令进行包管理,默认的包服务器在国外,安装起来比较慢,所以要替换为国内源镜像。

包服务器配置在C:\msys64\etc\pacman.d目录下,修改方案参考msys2 配置国内镜像源 – 梦回故里

修改好包镜像源之后,在接下来的步骤里就可以体验极速安装软件包的感觉了。

工具链安装

在MSYS2的mingw32子系统环境下,编译FFmpeg可以用gcc工具链,这种方式编译出来的dll没有pdb文件,不是本文描述的目标。本文描述的是怎么用微软的Visual C++自带的编译器cl.exe来交叉编译FFmpeg。

首先保证系统中已正确安装了Visual Studio 2019或更新的版本。

在开始菜单输入msys,按照提示打开MSYS2 MINGW32子环境。

在msys命令行环境下如下命令:

#从服务器下载新的软件包数据库
pacman -Sy

#安装gcc工具链
pacman -S mingw-w64-i686-toolchain
pacman -S msys/base-devel
pacman -S yasm nasm gcc

#SDL2是ffplay的依赖,如果没有,则编译不出ffplay.exe。
#此方式安装的SDL开发包仅对采用gcc工具链编译ffplay有效,对msvc工具链编译ffplay无效。
pacman -S mingw-w64-i686-SDL2

打开VC开发命令行

因为我们是在MSYS2 MINGW32环境下,调用MSVC工具链来交叉编译FFmpeg项目源码,所以必须运行VC的开发命令行环境。

有两种方式打开VC开发命令行:

1.在开始菜单输入x86 Native,按照提示打开VC的开发模式的命令行环境,主要目的是初始化一些与VC工具链相关的环境变量。打开VC命令行后,cd到C:\msys64目录下执行msys2_shell.cmd。这种模式需要确保MSYS2_PATH_TYPE=inherit环境变量被正确设置,方法有两种,第一种是修改msys2_shell.cmd文件,将设置MSYS2_PATH_TYPE变量的那一行的rem关键字删除,第二种是执行msys2_shell.cmd命令时带上-full-path参数,建议采用第二种方法。

2.先打开msys环境,再执行"C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars32.bat"命令。

作者采用的是第一种方式,没有试过第二种方式。

用MSVC工具链编译

本节给出作者编写的自动化编译脚本,有些参数可根据自己的实际需求修改。

#!/bin/sh

make_dirs() (
    mkdir -p bin_Win32d/lib
)

clean() (
    make distclean > /dev/null 2>&1
)

config() (

OPTIONS="
    --arch=x86 \
    --toolchain=msvc \
    --target_os=win32 \
    --enable-debug \
    --disable-optimizations \
    --enable-shared"

PKG_CONFIG_PATH=/mingw32/i686-AMD-win32/lib/pkgconfig

EXTRA_CFLAGS="-D_WIN32_WINNT=0x0601 -DWINVER=0x0601 -MDd -Zo -GS -I/mingw32/i686-AMD-win32/include -I/mingw32/i686-AMD-win32/include/SDL2 -I compat/atomics/win32"

EXTRA_LDFLAGS="-LIBPATH:/mingw32/i686-AMD-win32/lib"

sh ./configure ${OPTIONS} --extra-cflags="${EXTRA_CFLAGS}" --extra-ldflags="${EXTRA_LDFLAGS}"

)

build() (
    make -j$NUMBER_OF_PROCESSORS
)

echo "building ffmpeg with msvc ..."
make_dirs
clean
config
build

上述脚本其中最令人迷惑的是/mingw32/i686-AMD-win32/include/SDL2,这个其实是因为mingw32环境下直接安装的SDL2不是msvc工具链编译的,因此需要从SDL2官方下载源码然后用VS直接编译MSVC版本的SDK放置到msys2根目录下的/mingw32/i686-AMD-win32/子目录中即可。

总结

在Windows上,用MSYS2+msvc工具链编译出带有pdb文件的FFmpeg开发库是有一点难度的,遇到问题可以阅读configure脚本,大部分问题都能在configure脚本中找到答案。

猜你喜欢

转载自blog.csdn.net/bigwave2000/article/details/132258282