下载msys2
下载添加yasm
安装编译x264
安装编译ffmpeg
报错分析
下载msys2
安装完成之后,先把安装目录下的msys2_shell.cmd中注释掉的rem set MSYS2_PATH_TYPE=inherit改成set MSYS2_PATH_TYPE=inherit,这样后面就可以继承VS下的环境
![](https://i-blog.csdnimg.cn/blog_migrate/267eb5995f91112867430e2f147b2a0f.png)
重命名D:\msys64\usr\bin\link.exe 为D: \msys64\usr\bin\link.bak, 避免和MSVC 的link.exe
安装编译工具,打开msys2.exe, (D: \msys64是我的msys2的安装目录)
![](https://i-blog.csdnimg.cn/blog_migrate/b3f9a7a6d60e375feb6e79eeb79029ce.png)
然后输入指令下载mingw编译工具(会提示下载那些包,我直接全部下载)
# 编译32位库使用i686这个
pacman -S mingw-w64-i686-toolchain
# 编译64位库使用x86_64这个
pacman -S mingw-w64-x86_64-toolchain
下载yasm
下载YASM,根据你要编译多少位的库,选择不用的下载
![](https://i-blog.csdnimg.cn/blog_migrate/c1574f8fb30c9c4dee60ecffcccc2b7b.png)
下载好之后,将yasm-1.3.0-win32.exe(x64的是yasm-1.3.0-win64.exe) 改名为yasm.exe,并放置于 MSYS2 安装目录D:/msys64/usr/bin/ 中
安装编译x264
下载x264包,如果git速度很慢,可以直接下载压缩包解压到对应目录下(D:\msys64\home\Administrator, administrator我的目录,根据自己的home下的目录存放压缩包)
git clone http://git.videolan.org/git/x264.git
![](https://i-blog.csdnimg.cn/blog_migrate/26b60c7773d6845f60a7053bcf7aa4fb.png)
Administrator
带开一个cmd窗口,(windows键 + R,输入cmd,按回车)
#跳转到msys2的目录下,输入msys2_shell.cmd -mingw32,回车打开msys的mingw32
d:
cd msys64
msys2_shell.cmd -mingw32
#(64位的要输入msys2_shell.cmd -mingw64)
![](https://i-blog.csdnimg.cn/blog_migrate/575c19801f55e84fd2991fd58e8ced84.png)
打开mingw32的窗口后,输入如下转换到x264目录下,操作如下
cd x264
./configure --disable-cli --enable-shared --disable-win32thread --disable-thread --extra-ldflags=-Wl,--output-def=libx264.def --host=mingw32 --disable-asm --enable-static
# -–host 指定编译器, 编译64位改为 --host=mingw32, 下面这条是编译64位的指令
./configure --disable-cli --enable-shared --disable-win32thread --disable-thread --extra-ldflags=-Wl,--output-def=libx264.def --host=mingw64 --disable-asm --enable-static
make -j8
make install
# make install完成后, bin、inclue、lib会被复制到/usr/local/目录下
![](https://i-blog.csdnimg.cn/blog_migrate/cf6383faf881e582cc468a4f0bc79042.png)
# 生成.lib文件, 将libx264.def转为libx264.lib
# 32位的指令
lib /machine:i386 /def:libx264.def
# 64位的指令
lib /machine:X64 /def:libx264.def
# 生成的libx264.lib就在当前目录下
编译ffmpeg
打开VS的开发者命令工具, 编译32位的选择x86,64位的选择x64,并切换到msys2的目录下,打开msys2的终端
![](https://i-blog.csdnimg.cn/blog_migrate/d9154d800de4b3df5fdaedde1add257a.png)
# 切换目录打开,msys2的终端
cd /
cd msys2
msys2_shell.cmd
下载ffmpeg的源码,如果git很慢,可以先下载压缩包再解压到目录下(我的是D:\msys64\home\Administrator)
git clone git://source.ffmpeg.org/ffmpeg.git
cd ffmpeg
./configure --toolchain=msvc --enable-yasm --enable-asm --enable-gpl --enable-libx264 --extra-cflags=-I/usr/local/include --extra-ldflags=-LIBPATH:/usr/local/lib --enable-static --enable-shared
make
make install
install 完成就可以其 usr/local/bin lib include查看编译好的.dll .lib 以及.h文件也在此处
一些报错分析
Error:make cmommand not found
解决方式:
找到...msys64\mingw32\bin目录,将mingw32-make.exe复制一份,然后将其更名位为make.exe
ERROR:x264 not found using pkg-config
![](https://i-blog.csdnimg.cn/blog_migrate/c3b2ad128cda2155173f11e1eb345025.png)
解决方式:
# 加pkgconfig的环境变量 直接在msys2中输入即可
# 路径是编译x264时,x264.pc文件所在的路径
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
# 然后再进行编译
./configure --toolchain=msvc --enable-yasm --enable-asm --enable-gpl --enable-libx264 --extra-cflags=-I/usr/local/include --extra-ldflags=-LIBPATH:/usr/local/lib --enable-static --enable-shared
# 或者打开etc/profile,加入内容
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig
# 保存关闭profile后,在终端中输入
source /etc/profile
./configure --toolchain=msvc --enable-yasm --enable-asm --enable-gpl --enable-libx264 --extra-cflags=-I/usr/local/include --extra-ldflags=-LIBPATH:/usr/local/lib --enable-static --enable-shared
编译ffmeg时报错,内容如下
fftools/cmdutils.c(1119): error C2065: “slib”: 未声明的标识符
fftools/cmdutils.c(1119): error C2296: “%”: 非法,左操作数包含“char [138]”类型
fftools/cmdutils.c(1119): error C2059: 语法错误:“数字上的错误后缀”
fftools/cmdutils.c(1119): error C2059: 语法错误:“%”
fftools/cmdutils.c(1119): error C2017: 非法的转义序列
fftools/cmdutils.c(1119): error C2001: 常量中有换行符
fftools/cmdutils.c(1150): error C2143: 语法错误: 缺少“)”(在“*”的前面)
fftools/cmdutils.c(1150): error C2143: 语法错误: 缺少“{”(在“*”的前面)
fftools/cmdutils.c(1150): error C2059: 语法错误:“)”
fftools/cmdutils.c(1151): error C2054: 在“options”之后应输入“(”
fftools/cmdutils.c(1252): error C2143: 语法错误: 缺少“)”(在“*”的前面)
fftools/cmdutils.c(1252): error C2143: 语法错误: 缺少“{”(在“*”的前面)
fftools/cmdutils.c(1252): error C2059: 语法错误:“)”
fftools/cmdutils.c(1253): error C2054: 在“avclass”之后应输入“(”
fftools/cmdutils.c(1261): error C2275: “AVInputFormat”: 将此类型用作表达式非法
解决方式:
找到对应的.c文件,打开后定位到报错的行,将其注释掉(warning类的提醒不用管)
主要是注释掉包含 CC_IDENT ,这个宏定义所在的行
报错的不是cmdutils.c文件,处理的方式也是一样的,ffmpeg各版本之间有一些差异
注释掉之后,在进行在进行编译再继续
# 主要是注释掉包含 CC_IDENT ,这个宏定义所在的行
//av_log(NULL, level, "%sbuilt with %s\n", indent, CC_IDENT);
//print_str("compiler_ident", CC_IDENT);