手把手教你在Windows下使用MinGW编译libav
libav是在Linux下使用纯c语言开发的,不可避免的,libav源码使用了一些gcc的特性,那么在Windows下很难使用VC编译,但是使用MinGW编译却简单多了,下面我将根据自己的经历逐步介绍使用MinGW编译libav的过程以及在此过程中遇到的问题及其解决方法。
l 下载和运行最新的mingw-get-inst版本。
l 选择安装MinGW的目录,注意:安装目录的路径中不能包含空格符。
l 安装可选的组件:C++编译器、Forthan编译器、Objective-C编译器、Ada编译器和MSYS。
图1:选择需要安装的组件
由于我们需要使用MinGW编译libav,因此除了C编译器之外,还需要选择C++编译器和MSYS,如图1所示。
接下来,安装程序会下载并运行mingw-get CLI安装程序安装GCC 。取决于你的网络状况,这个过程可能会持续数分钟。在使用MinGW之前,请将${MinGWDir}\bin添加到PATH环境变量,其中${MinGWDir}是MinGW的安装目录,默认情况下${MinGWDir}=C:\MinGW。
安装完成后,打开开始菜单 ->程序 -> MinGW -> MinGW Shell,运行MinGW。
请检查${MinGWDir}\msys\1.0\bin(默认为C:\MinGW\msys\1.0\bin)下有没有pr.exe,如果没有,那么在编译libav过程中,执行./configure会报错:pr command not found。
下载coreutils-win32-5.3.0-bin.zip,解压并将bin目录下的内容拷贝到${MinGWDir}\msys\1.0\bin(默认为C:\MinGW\msys\1.0\bin)下。
编译libav需要用到yasm.exe,如果你的系统中没有yasm.exe,执行./configure会报错:yasm not found。下载Windows 32位版本的yasm.exe(如果使用64位系统,下载64位的yasm.exe)。
下载完成之后,重命名为yasm.exe,并将之拷贝到${MinGWDir}\msys\1.0\bin(默认为C:\MinGW\msys\1.0\bin)下。
到此为止,编译环境已经搭建完成。
libav是使用git开发的,因此你需要安装一个git客户端来取得git的源代码。
下载git客户端,默认安装即可。安装完成之后,打开 开始菜单 -> 程序 -> Git-> Git Bash 运行git控制台。
Git Bash是一个类Linux Shell控制台,其用法与Linux下的Bash一致。
如果你运行libav下的./configure时,启用了--enable-libx264选项,那么在编译过程中,libav就会依赖libx264,因此你需要提前编译libx264。如果你不启用--enable-libx264选项,那么你可以跳过这一节。
新建一个目录用于存放libx264的源代码(例如我在D盘下新建了名为x264的目录),注意存放该代码的路径中不应该包含空格符。
启动git bash,并进入刚才新建的目录。以我的为例,在git bash下输入cd /d/x264即可。
进入源码目录之后,在git bash中键入git clone git://git.videolan.org/x264.git。按回车之后git就会自动从源码库下载源码到本地。取决于你的网络状况,这个过程可能会持续数分钟。
代码下载完成之后,启动MinGW,并进入x264源码目录。以我的为例,在MinGW bash下输入cd /d/x264/x264即可。
输入./configure –help查看配置选项。你可以根据自己的需要选择配置选项。
我的配置选项是--enable-shared --disable-cli --enable-win32thread(推荐启用这个选项,否则编译出来的libx264会依赖MinGW的pthreadGC2.dll,这样你打包发行程序时就会额外附加一个dll文件)。
键入./configure --enable-shared --disable-cli --enable-win32thread,按回车,配置编译环境。配置成功之后,系统会提示:You can run ‘make’ or ‘make fprofiled’ now.
键入make命令,就会开始编译了,这个过程很快就结束,如果编译成功的话,你就能够在源码目录下面找到libx264-128.dll文件(取决于你的x264源码版本,128可能是一个其他的数字,不过这个版本号不能低于118,否则无法通过libav配置检查)和libx264.dll.a文件。
如果你希望你的libav支持x264编码,那么在编译libav时,你的编译环境中就需要libx264库,否则配置libav时,会报错:ERROR: libx264 not found;如果你不需要x264,那么你可以跳过这一节。
将生成的libx264-128.dll(参考第3节)拷贝到${MinGWDir}\bin(默认为C:\MinGW\bin)下;将生成的libx264.dll.a拷贝到${MinGWDir}\lib(默认为C:\MinGW\lib)下;将源码x264.h和x264_config.h拷贝到${MinGWDir}\include(默认为C:\MinGW\include)下。这样你的MinGW就具备了libx264环境。
创建一个目录c++workspace(目录名取决于你的喜好)用于存放源代码。打开git bash,进入该目录(cd /d/c++workspace/ 你的路径有可能与我的不同)。
键入git config --global core.autocrlf false。默认情况下,git会根据你的操作系统环境自动将文本文件的换行符替换成当前系统默认的换行符,如果你使用Windows操作系统,那么git会将换行符换成\r\n,如果你使用的unix-like操作系统,换行符就会替换成\n。由于libav是在linux下开发的,其所有源码文件的换行符都是\n,那么你使用git clone其源码时,git会将所有的\n替换成\r\n,当使用MinGW编译时,MinGW不识别\r\n,当执行make时,会报告一个错误:library.mak:92:*** missing separator. Stop. 。面命令的作用就是让git不要自动将\n替换成\r\n。
然后键入git clone git://git.libav.org/libav.git。git就会从源码库到把源代码下载到本地。Libav下载链接提供了多个Clone URL。你可以根据需要选择一个,我选择的就是第一个。取决于你的网络状况,这个过程会持续数分钟。
源代码获取完之后,打开MinGW bash。进入libav目录,在MinGW控制台键入./configure --help查看所有的配置选项,你可以根据需要定制你需要的组件。下面我列下我自己的编译选项。
./configure --enable-gpl --enable-shared--disable-static --disable-doc --disable-avconv --disable-avplay--disable-avprobe --disable-avserver --enable-libx264 --disable-debug
至于这些编译选项的具体含义,请键入./configure --help获取帮助。
配置完成之后,会有一个关于pkg-config的警告信息,直接无视即可。(无视的原因是因为配置选项中添加了--disable-avplay,如果你没有添加该选项,你需要安装SDL的MinGW开发库和pkg-config)。
键入make –r命令,就开始大概半个小时的编译过程。编译完成之后,编译生成的结果分布在各个子目录下。结果清单如下:
libav\libavcodec目录:avcodec-54.defavcodec-54.dll avcodec.dll avcodec.lib
libav\libavformat目录:avformat-54.defavformat-54.dll avformat.dll avformat.lib
等等,由于篇幅原因,就不在此一一列出了,你可以自己到各个目录下找生成的文件。
你可以将所有生成的dll、def和lib文件复制到同一个目录下面。例如:我就将所有生成的dll,def和lib文件都复制到了libav\bin目录下。注意:生成的libav库会依赖libx264-128.dll,因此发布时请将libx264-128.dll与libav库捆绑在一起。
MinGW编译libav使用dlltool生成lib文件,如果你在VC环境下使用这些lib文件。你需要将项目属性下的linker-> optimization –> References设置成No (/OPT:NOREF),如图2所示,否则程序将会崩溃。
图2:引用设置
使用lib.exe生成的lib文件则没有这个要求。
如果你想生成在YES (/OPT:REF)选项下(Release模式下的默认选项)正常运行的lib,你执行如下操作:
1. 打开Visual Studio Command Prompt。
2. 进入编译结果的存放目录(我的为D:\c++workspace\libav\bin)。
3. 使用lib.exe生成新的lib文件:键入lib /machine:i386 /def:foo-version.def /out:foo.lib,将命令中的foo-version和foo替换成库名即可。例如如果你想重新生成avcodec.lib,键入lib /machine:i386 /def: avcodec-54.def /out: avcodec.lib即可。
Libav会用到两个头文件stdint.h和inttypes.h。我发现VisualStudio 2010已经提供stdint.h,Visual Studio 2005两个都没有提供,因此如果你需要使用libav的话,你需要下载inttypes.h,并将其放置在VC可以找到的地方。
并且你还需要在预编译选项中定义__STDC_CONSTANT_MACROS宏,否则会出现类似“INT64_C无法找到”的编译错误。