转自:http://www.th7.cn/Program/cp/201407/242762.shtml

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

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

1      安装MinGW编译环境

1.1    安装MinGW

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。

1.2    安装coreutils

请检查${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)下。

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可以找到的地方。

并且你还需要在预编译选项中定义__STDC_CONSTANT_MACROS宏,否则会出现类似“INT64_C无法找到”的编译错误。

文章出处:http://blog.csdn.net/wangpingfang/article/details/8133622

官方参考资料:https://libav.org/platform.html

手把手教你在Windows下使用MinGW编译libav(参考libx264的编入)的更多相关文章

  1. 史上最全最详细的环境搭建教程,行百里者手把手教你在windows下搭建Anaconda+pycharm+库文件(TensorFlow,numpy)环境搭建

    我是在搭建TensorFlow开发环境的道路上走了很多弯路 掉了很多头发,为了让广大同学们不在受苦受累 下面我将手把手教你学习如特快速搭建python环境 快速导入numpy,PIL,pillow,等 ...

  2. Windows下使用MINGW编译ffplay

    之前考虑到需要快速配置编译ffplay,使用了比较暴力的方法,具体可以参考编译ffplay.exe简化版. 这里介绍下相对规范的做法. 前提:已经安装了Windows下GCC开发环境--MINGW+m ...

  3. Windows下用Mingw编译Boost.Regex库

    下载Boost库,解压. 定位到regex库文件夹下. GCC所对应的MAKEFILE为gcc.mak 进入命令提示符下,输入make -f gcc.mak 这是如果直接按回车执行的话,会出现错误: ...

  4. 手把手教你在Windows下搭建React Native Android开发环境

    最近看到React Native好像好厉害的样子,好奇心驱使之下体验了一下并将在Window下搭建React Natvie Android环境的步骤记录下来,并有需要的朋友参考.(我都是参考官方文档的 ...

  5. 在Windows下利用MinGW编译FFmpeg

    目录 [隐藏]  1 环境与软件 2 第一步:安装MinGW 3 第二步:配置编译环境 4 第三步:配置SDL 5 第四步:编译 5.1 编译faac 5.2 编译fdk-aac 5.3 编译x264 ...

  6. 再次尝试windows下msys+MinGW编译ffmpeg

    电脑上安装太多的开源库,环境变量里面一些常用的头文件都有几种,以前使用的编译ffmpeg的方法现在常常提示错误.从config.log中看,这些错误往往都是一些头文件引用错误导致.由于项目中继续编译自 ...

  7. windows下用mingw编译linux项目

    1.下载安装mingw32 2.将mingw下bin和msys\1.0下bin设置为系统path 3.启动msys.bat 4.cd到项目目录 5.输入./configure 6.输入make 7.输 ...

  8. windows下使用mingw编译python扩展模块

    环境: 1.python2.7.2 2.mingw20120426 说明: PYTHON_HOME:不做特殊说明的话,默认代表python的安装路径. MINGW_HOME:不做特殊说明的话,默认代表 ...

  9. windows下使用mingw编译出ffplay(简化版)

    之前编译FFmpeg直接使用dll.lib,默认的mingw也不会编译出ffplay.exe. 近期由于工作需要,需要验证下修改之后的FFmpeg版本是否正常,需要使用ffplay.exe. 比较暴力 ...

随机推荐

  1. ThinkPHP3.2 行为扩展以及插件机制介绍!

    首先行为扩展这个概念是TP架构的核心组成之一,关于行为的解释我就粗略的概括一下吧:TP在从接受到HTTP请求到最终将视图输出,期间经历的很多步骤,这些步骤大家可以在http://document.th ...

  2. 如何建立批处理文件(.bat或.cmd)

    如何建立批处理文件(.bat或.cmd) 建立批处理文件 批处理文件就是把多个dos命令放在一起. 批处理文件是无格式的文本文件,它包含一条或多条命令.它的文件扩展名为 .bat 或 .cmd.在命令 ...

  3. IE8 松散耦合进程框架(Loosely-Coupled IE (LCIE)--特性介绍

    官方介绍:http://blogs.msdn.com/b/ie/archive/2008/03/11/ie8-and-loosely-coupled-ie-lcie.aspx 参考文档:http:// ...

  4. Open Credit System

    Open Credit SystemInput: Standard Input Output: Standard Output In an open credit system, the studen ...

  5. FineUI第一天

    示例:http://fineui.com/demo/ 文档:http://fineui.com/doc/ 下载:http://fineui.codeplex.com/ 1.fineUI基于extjs, ...

  6. unity3d camera.culling mask

    原地址:http://www.cnblogs.com/88999660/archive/2013/03/14/2959439.html 官方文档对CullingMask的注释只是说了通过位移运算符,可 ...

  7. iPhone/iOS图片相关(读取、保存、绘制、其它相关)

    http://blog.csdn.net/jerryvon/article/details/7526147 20:50:42 一.读取图片 1.从资源(resource)读取 UIImage* ima ...

  8. convert jar to java

    (文章是从我的个人主页上粘贴过来的,大家也可以访问我的主页 www.iwangzheng.com) 首先解压一下下载的jar文件,extract jar file , $jar -xvf file.j ...

  9. FastJSON 简介及其Map/JSON/String 互转

    在日志解析,前后端数据传输交互中,经常会遇到 String 与 map.json.xml 等格式相互转换与解析的场景,其中 json 基本成为了跨语言.跨前后端的事实上的标准数据交互格式.应该来说各个 ...

  10. thinkphp 前台html调用函数 格式化输出

    仅仅是输出变量并不能满足模板输出的需要,内置模板引擎支持对模板变量使用调节器和格式化功能,其实也就是提供函数支持,并支持多个函数同时使用.用于模板标签的函数可以是PHP内置函数或者是用户自定义函数,和 ...