文章目录
- 前言
- 准备
- msys2环境配置
- 添加执行路径
- 安装命令
- configure常用选项
- 其他库
- 编译x264
- 编译sdl2
- 疑难杂症
- cl is unable to create an executable file.
- 无法解析的外部符号_mainCRTStartup
- 找不到LIBCMT.lib
- 结尾
前言
在我看了雷神的博客之后,便开始我的ffmpeg开发之旅,然后发现雷神的Windows开发环境教程提供的网络链接竟然被墙了。于是我得开始手动编译ffmpeg静态库之旅 大坑。
于是我在ffmpeg官网里面找到一篇古老的基于MSVC编译ffmpeg教程。下面我将展示如何使用VS2019编译。
准备
- Windows10
- VS 2019 Community
- msys2 (无须使用MinGW)
下载完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
结尾
- 编译后发现libavresample库已经被废弃了…改为swresample库了
- x264生成的头文件有问题…oclobj.h需要手动修改
- configure生成config.h一样也有坑,需要手动把CC_IDENT改掉(改成空串即可)