手把手教你在Windows下使用MinGW编译libav

手把手教你在Windows下使用MinGW编译libav linux

libav是在Linux下使用纯c语言开发的,不可避免的,libav源码使用了一些gcc的特性,那么在Windows下很难使用VC编译,可是使用MinGW编译却简单多了,下面我将根据本身的经历逐步介绍使用MinGW编译libav的过程以及在此过程当中遇到的问题及其解决方法。c++

1      安装MinGW编译环境
1.1    安装MinGW
l  下载和运行最新的mingw-get-inst版本。git

l  选择安装MinGW的目录,注意:安装目录的路径中不能包含空格符。bash

l  安装可选的组件:C++编译器、Forthan编译器、Objective-C编译器、Ada编译器和MSYS。网络

 

图1:选择须要安装的组件ide

 

因为咱们须要使用MinGW编译libav,所以除了C编译器以外,还须要选择C++编译器和MSYS,如图1所示。编码

接下来,安装程序会下载并运行mingw-get CLI安装程序安装GCC 。取决于你的网络情况,这个过程可能会持续数分钟。在使用MinGW以前,请将${MinGWDir}\bin添加到PATH环境变量,其中${MinGWDir}是MinGW的安装目录,默认状况下${MinGWDir}=C:\MinGW。spa

安装完成后,打开开始菜单 ->程序 -> MinGW -> MinGW Shell,运行MinGW。操作系统

1.2    安装coreutils
请检查${MinGWDir}\msys\1.0\bin(默认为C:\MinGW\msys\1.0\bin)下有没有pr.exe,若是没有,那么在编译libav过程当中,执行./configure会报错:pr command not found。.net

下载coreutils-win32-5.3.0-bin.zip,解压并将bin目录下的内容拷贝到${MinGWDir}\msys\1.0\bin(默认为C:\MinGW\msys\1.0\bin)下。

1.3    安装yasm.exe
编译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)下。

到此为止,编译环境已经搭建完成。

2      安装git
libav是使用git开发的,所以你须要安装一个git客户端来取得git的源代码。

下载git客户端,默认安装便可。安装完成以后,打开 开始菜单 -> 程序 -> Git-> Git Bash 运行git控制台。

Git Bash是一个类Linux Shell控制台,其用法与Linux下的Bash一致。

3      编译libx264
若是你运行libav下的./configure时,启用了--enable-libx264选项,那么在编译过程当中,libav就会依赖libx264,所以你须要提早编译libx264。若是你不启用--enable-libx264选项,那么你能够跳过这一节。

3.1    获取libx264源码
新建一个目录用于存放libx264的源代码(例如我在D盘下新建了名为x264的目录),注意存放该代码的路径中不该该包含空格符。

启动git bash,并进入刚才新建的目录。以个人为例,在git bash下输入cd /d/x264便可。

进入源码目录以后,在git bash中键入git clone git://git.videolan.org/x264.git。按回车以后git就会自动从源码库下载源码到本地。取决于你的网络情况,这个过程可能会持续数分钟。

3.2    编译libx264
代码下载完成以后,启动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文件。

4      编译libav
4.1    配置libx264
若是你但愿你的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环境。

4.2    获取libav源码
建立一个目录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。你能够根据须要选择一个,我选择的就是第一个。取决于你的网络情况,这个过程会持续数分钟。

4.3    编译libav
源代码获取完以后,打开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库捆绑在一块儿。

4.4    使用lib.exe从新生成lib文件
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便可。

4.5    兼容MSVC的inttypes.h Libav会用到两个头文件stdint.h和inttypes.h。我发现VisualStudio 2010已经提供stdint.h,Visual Studio 2005两个都没有提供,所以若是你须要使用libav的话,你须要下载inttypes.h,并将其放置在VC能够找到的地方。

相关文章
相关标签/搜索