文章目录

  • 前言
  • 准备
  • msys2环境配置
  • 添加执行路径
  • 安装命令
  • configure常用选项
  • 其他库
  • 编译x264
  • 编译sdl2
  • 疑难杂症
  • cl is unable to create an executable file.
  • 无法解析的外部符号_mainCRTStartup
  • 找不到LIBCMT.lib
  • 结尾


前言

在我看了雷神的博客之后,便开始我的ffmpeg开发之旅,然后发现雷神的Windows开发环境教程提供的网络链接竟然被墙了。于是我得开始手动编译ffmpeg静态库之旅 大坑
于是我在ffmpeg官网里面找到一篇古老的基于MSVC编译ffmpeg教程。下面我将展示如何使用VS2019编译。

准备

下载完msys2后,打开msys2 shell执行命令,安装必要的包

pacman -Syu # 更新系统核心和包 如果下载速度慢则更改镜像
pacman -S nasm # 或者 pacman -S yasm
pacman -S make
pacman -S diffutils # 要用到cmp命令
pacman -S pkg-config

msys2环境配置

需要使用vs2019 用命令窗口(工具->命令行->开发者命令提示)打开(在msys2安装目录下的)msys2_shell.cmd

  • 这步目的是确保msys2_shell的LIB环境变量包含msvc的vc/lib目录。
  • 如果LIB环境包含的是32位(x86)的库,想换成64位,则执行以下脚本
C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Auxiliary\Build\vcvars64.bat
  • 找不到相关脚本,则就在开始菜单栏搜索“Cross Tools Command Prompt for VS 2019”找到对应执行文件。

以下步骤在msys2 shell里操作

添加执行路径

export PATH="/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.29.30037/bin/Hostx64/x64":$PATH

(我使用的是 VS2019-v142 x64,其他版本可在对应VC目录下寻找相应目录)
注意: msys2自带有一个link.exe和msvc的冲突,解决办法是把msys中usr/bin目录下的link.exe重命名或删去后来发现configure里面调用的是compat/windows/mslink命令链接,mslink已经重定向了link命令。

安装命令

# 和linux环境下一样
./configure --target-os=win64 --arch=x86_64 --toolchain=msvc  --enable-shared --disable-static
# 如果是32位:
# ./configure --toolchain=msvc
make
make install

configure常用选项

--prefix:生成文件目录
--enable-shared:构建shared库
--arch:目标架构(常用有aarch64,arm,ia64,x86,x86_32,x86_64)
--enable-libx264:通过x264使用h.264编码 #类似 --enable-libopenh264
--enable-gpl:允许使用gpl代码(涉及gpl污染~使用x264库时需要)
--extra-cflags:(c)编译参数 # --extra-cflags="-MDd" debug版本
--extra-libs:链接参数 # --extra-ldflags="/NODEFAULTLIB:libcmt"
--enable-debug:debug版本

其他库

编译x264

ffmpeg有时候会需要用到h.264编码,这里我们使用x264库。这时候就要编译成Windows静态库

CC=cl ./configure --enable-shared --prefix=<PREFIX> --extra-cflags="-DNO_PREFIX"
make
make install-lib-shared

NO_PREFIX标识一定要加!

安装之后,需要把x264的头文件和静态库目录分别添加到INCLUDE和LIB环境变量里面

这里会遇到坑点,请确保INCLUDE和LIB环境变量格式的正确性!

编译sdl2

发现上面编译结果是没有ffplayer.exe, 因为ffplayer需要用到sdl2库。

./configure --enable-shared
make
make install

疑难杂症

cl is unable to create an executable file.

确认msys shell是否包含cl命令,如果没有包含则添加执行路径

无法解析的外部符号_mainCRTStartup

找不到LIBCMT.lib

msys2_shell需要使用vs2019 的Cross Tools Command Prompt打开!
在msys2_shell里面用env命令确认LIB环境变量是否包含msvc的静态库目录。

# vs2019 community v142 如下目录
/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.29.30037/lib/x64

如果LIB环境变量没有包含,则可以手动添加:

export LIB="/c/Program Files (x86)/Microsoft Visual Studio/2019/Community/VC/Tools/MSVC/14.29.30037/lib/x64":$LIB

结尾

  1. 编译后发现libavresample库已经被废弃了…改为swresample库了
  2. x264生成的头文件有问题…oclobj.h需要手动修改
  3. configure生成config.h一样也有坑,需要手动把CC_IDENT改掉(改成空串即可)