ffmpeg 64位静态库编译

ffmpeg 64位静态库编译

最近在用vs2017编译webrtc,发现webrtc官方不让用msvc编译器编译里面的ffmpeg,但是又需要用到ffmpeg,于是单独编译了ffmpeg,编译的是ffmpeg的动态库版本,然后在webrtc里面链接库和头文件。
而最终在demo的成果物里面,需要包含了avcodec-59.dll,avdevice-59.dll,avfilter-8.dll等ffmpeg的动态库,demo才能运行,而如果编译出ffmpeg的静态库,则webrtc的demo里面就不需要这些动态库,发布相关的安装包时,安装包能小不少。
关于webrtc的编译,可以参考我的如下链接:
https://blog.csdn.net/tusong86/article/details/120554374

ffmpeg的动态库编译其实是简单的,主要是因为ffmpeg对外提供的是标准的c接口,所以在windows平台,mingw编译出的动态库,无论是vs2008,还是vs2015,还是vs2019,都是可以正常链接的。但是如果编译的是ffmpeg的静态库版本,由于静态库的本质跟动态库不一样,静态库的本质,其实跟linux的.o文件,windows的obj文件是一样的,vs2015编译的静态库,vs2017可能就没法用,故编译时,采取vs2017编译器编译ffmpeg。
ffmpeg在windows下提供的编译环境是mingw.

一、安装MinGW-w64
打开网址:https://sourceforge.net/projects/mingw-w64/files/,选择下载如下:
在这里插入图片描述

这是个在线安装工具,本人安装到的是c盘,如下是安装成功后的截图。
在这里插入图片描述
双击进入到文件夹mingw64里面,如下所示:
在这里插入图片描述
注意到上面红色方框的文件夹msys,这是个工具集文件夹,里面会有bash,grep等命令的程序文件,在安装mingw64的时候,是没有的,这里是我下载好后放进去的,此外后续编译ffmpeg之前,还需要先用gcc编译yasm,为此需要将mingw64下面的bin目录加入到path路径下,如下图所示:
在这里插入图片描述
然后我们说说msys的下载。

二、下载msys
打开如下网址:
https://sourceforge.net/projects/mingw-w64/files/External%20binary%20packages%20%28Win64%20hosted%29/MSYS%20%2832-bit%29/
选择如下红色方框的zip文件。
在这里插入图片描述
下载后,我们将MSYS-20111123.zip解压缩,并放置于mingw-64的安装目录下,用户可以通过上面的图片找到具体放置位置.

三 编译安装yasm
yasm是个汇编器,在编译ffmpeg的时候,需要用到,为此,先要在mingw的环境下,编译安装yasm.
首先下载yasm,这个比较容易,下载地址如下:
https://www.linuxfromscratch.org/blfs/view/svn/general/yasm.html
下载下来的文件名是yasm-1.3.0.tar.gz,放于e盘的ffmpeg目录下,然后解压缩,如下所示:
在这里插入图片描述
现在开始编译安装yasm,首先打开mingw环境,如下所示:
在这里插入图片描述
双击msys.bat,打开mingw环境,切换到yasm的编译目录在这里插入图片描述
然后再依次执行
./configure --prefix=/usr/local/yasm
make
make install
命令执行完后,可以在对应的目录下找到yasm的成果物,如下:
在这里插入图片描述
四 ffmpeg编译
我们需要的是ffmpeg静态库,故跟编译器关联,由于我们最终是要在vs2017中用,为此ffmpeg也需要用vs2017的编译器进行编译,其实mingw的编译器也能编译出静态库,但是加入到vs2017工程时,会有一些链接错误.

首先:关闭掉刚才打开的mingw终端,然后修改启动文件msys.bat,在文件的起始位置,加入这句调用.
在这里插入图片描述
这句调用结束后,ffmpeg的编译就变成了64位的vs2017编译器进行编译,否则则是gcc编译器编译.

然后进入到ffmpeg的编译目录,e:\ffmpeg\ffmpeg
依次执行下面命令
export PATH=$PATH:/usr/local/yasm/bin
./configure --arch=x86_64 --disable-debug --prefix=./vs2017_build_static --toolchain=msvc
make

注意,这里面的toolchain=msvc一定要带,否则不是微软编译器编译。
在编译的时候,会有报错,如下所示:

在这里插入图片描述
注释掉相应的代码就行,如下图所示:
在这里插入图片描述
还有一个需要注释的是文件ffprobe.c,如下所示:
在这里插入图片描述
这两个地方注释掉后,ffmpeg就能编译过去了.

然后执行make install,
成果物就进入到目录vs2017_build_static,如下图所示:
在这里插入图片描述
这些后缀为a的文件就是编译出的静态库,我在最终项目用它们的时候,习惯改成windows的命名习惯,比如将libavcodec.a改成avcodec.lib.

而最终在项目中用时,会报一堆的链接错误.加上对应的库即可,此处我列举下我加入的库.
#pragma comment(lib, “avcodec.lib”)
#pragma comment(lib, “avformat.lib”)
#pragma comment(lib, “avutil.lib”)
#pragma comment(lib, “avdevice.lib”)
#pragma comment(lib, “avfilter.lib”)
#pragma comment(lib, “swresample.lib”)
#pragma comment(lib, “swscale.lib”)

#pragma comment(lib, “Mfuuid.lib”)
#pragma comment(lib, “Strmiids.lib”)
#pragma comment(lib, “Mfplat.lib”)
#pragma comment(lib, “Bcrypt.lib”)
#pragma comment(lib, “Secur32.lib”)
#pragma comment(lib, “ws2_32.lib”)
#pragma comment(lib, “Vfw32.lib”)
#pragma comment(lib, “Shlwapi.lib”)

注意:如果ffmpeg是以mingw自带的gcc编译器进行编译,则编译出的静态库,放到demo中时,会有如下的链接错误:

1>avcodec.lib(tiff.o) : error LNK2001: 无法解析的外部符号 __mingw_vsnprintf
1>avcodec.lib(ratecontrol.o) : error LNK2001: 无法解析的外部符号 __mingw_vsnprintf
1>avcodec.lib(cbs.o) : error LNK2001: 无法解析的外部符号 __mingw_vsnprintf
1>avcodec.lib(pamenc.o) : error LNK2001: 无法解析的外部符号 __mingw_vsnprintf
1>avcodec.lib(pnmenc.o) : error LNK2001: 无法解析的外部符号 __mingw_vsnprintf
1>avcodec.lib(xbmenc.o) : error LNK2001: 无法解析的外部符号 __mingw_vsnprintf
1>avcodec.lib(xsubenc.o) : error LNK2001: 无法解析的外部符号 __mingw_vsnprintf
1>avcodec.lib(mf_utils.o) : error LNK2001: 无法解析的外部符号 __mingw_vsnprintf
1>avcodec.lib(encode.o) : error LNK2001: 无法解析的外部符号 __mingw_vsnprintf
1>avcodec.lib(ffv1enc.o) : error LNK2001: 无法解析的外部符号 __mingw_vsnprintf

一看就是运行时库缺失,并且是mingw的运行时库,所以后面采取的是vs2017编译器进行编译。

2021-11-28:这几天需要将x264编译到ffmpeg静态库里面去,编译x264静态库时,用下面就行配置,否则编译的不是微软的。
CC=cl ./configure --enable-static --disable-asm --disable-opencl --disable-cli -–prefix=/usr/local/x264 --extra-cflags="-DNO_PREFIX"

然后链接x264库时,用下面配置

./configure --toolchain=msvc --arch=x86_64 --disable-debug --enable-gpl --enable-libx264 --extra-cflags="-I/usr/local/x264/include" --extra-ldflags=-LIBPATH:/usr/local/x264/lib --prefix=/home/ffmpeg_x264_static 

注意,–extra-ldflags=-LIBPATH,这里是-LIBPATH,之前是-L,但是configure时一直报错,根据ffbuild/config.log里面的内容,推算出这地方是-LIBPATH,其实LIBPATH就是微软编译器链接时,指定路径的关键词,如下图所示:
在这里插入图片描述

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值