手把手教你在Windows下使用MinGW编译libav(参考libx264的编入)
转自: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的编入)的更多相关文章
- 史上最全最详细的环境搭建教程,行百里者手把手教你在windows下搭建Anaconda+pycharm+库文件(TensorFlow,numpy)环境搭建
我是在搭建TensorFlow开发环境的道路上走了很多弯路 掉了很多头发,为了让广大同学们不在受苦受累 下面我将手把手教你学习如特快速搭建python环境 快速导入numpy,PIL,pillow,等 ...
- Windows下使用MINGW编译ffplay
之前考虑到需要快速配置编译ffplay,使用了比较暴力的方法,具体可以参考编译ffplay.exe简化版. 这里介绍下相对规范的做法. 前提:已经安装了Windows下GCC开发环境--MINGW+m ...
- Windows下用Mingw编译Boost.Regex库
下载Boost库,解压. 定位到regex库文件夹下. GCC所对应的MAKEFILE为gcc.mak 进入命令提示符下,输入make -f gcc.mak 这是如果直接按回车执行的话,会出现错误: ...
- 手把手教你在Windows下搭建React Native Android开发环境
最近看到React Native好像好厉害的样子,好奇心驱使之下体验了一下并将在Window下搭建React Natvie Android环境的步骤记录下来,并有需要的朋友参考.(我都是参考官方文档的 ...
- 在Windows下利用MinGW编译FFmpeg
目录 [隐藏] 1 环境与软件 2 第一步:安装MinGW 3 第二步:配置编译环境 4 第三步:配置SDL 5 第四步:编译 5.1 编译faac 5.2 编译fdk-aac 5.3 编译x264 ...
- 再次尝试windows下msys+MinGW编译ffmpeg
电脑上安装太多的开源库,环境变量里面一些常用的头文件都有几种,以前使用的编译ffmpeg的方法现在常常提示错误.从config.log中看,这些错误往往都是一些头文件引用错误导致.由于项目中继续编译自 ...
- windows下用mingw编译linux项目
1.下载安装mingw32 2.将mingw下bin和msys\1.0下bin设置为系统path 3.启动msys.bat 4.cd到项目目录 5.输入./configure 6.输入make 7.输 ...
- windows下使用mingw编译python扩展模块
环境: 1.python2.7.2 2.mingw20120426 说明: PYTHON_HOME:不做特殊说明的话,默认代表python的安装路径. MINGW_HOME:不做特殊说明的话,默认代表 ...
- windows下使用mingw编译出ffplay(简化版)
之前编译FFmpeg直接使用dll.lib,默认的mingw也不会编译出ffplay.exe. 近期由于工作需要,需要验证下修改之后的FFmpeg版本是否正常,需要使用ffplay.exe. 比较暴力 ...
随机推荐
- Jenkins 搭建U3D自动发布 Android
工具 [u3d相关的PostProcessBuildPlayer,PerformBuild.cs] 1.Jenkins 开源包 Java -jar jenkins.war,参考链接 http://w ...
- Source Insight 基本使用(1)-使用Source Insight查看Android Framework 源码
一.下载framework源码: google已经把framework源码托管在了gitHub上: https://github.com/android/platform_frameworks_bas ...
- 织梦dedecms如何快速使用拼音首字母做栏目名称
织梦默认使用拼音为保存目录的时候使用的是中文全拼,当遇到栏目名称比较长的时候目录名称看起来有点冗长,这时候大多数站长喜欢使用拼音首字母作为栏目的保存目录,那么有没有什么快速的办法能让我们快速的使用首字 ...
- apue第七章学习总结
apue第七章学习总结 1.main函数 程序是如何执行有关的c程序的? C程序总是从main函数开始执行.main函数的原型是 int main(int argc,char *argv[]); 其中 ...
- ASP.NET使用FileUpload上传文件
前台代码: <asp:FileUpload ID="fuKeleyi" runat="server" /> <asp:Button ID=&q ...
- dedecms发布文章时多个Tag间分割逗号自动变成英文逗号
dedecms发布文章时经常会添加多个Tag,我们输入汉字时总是喜欢使用全角的逗号,那么有没有办法使用JS脚本把输入的Tag间中文逗号变成英文逗号呢? dedecms发布文章时多个Tag间分割逗号自动 ...
- Windows主机里利用VMware安装Linux(CentOS)虚拟机,Host-only连接上网方式详解
关于Host-only指的是主机与虚拟机之间的互联,因此虚拟机是不能连网的,若需要连网则需要使用NAT模式: Host-only模式实现联网得考虑如下配置过程: 附:VMware虚拟机三种网络模式(B ...
- [Effective JavaScript 笔记]第6章:库和API设计--个人总结
前言 又到了一章的总结,这章里的内容.是把我从一个代码的使用者,如何换位成一个代码的编写者.如何让别人用自己的代码更容易,不用去注意太多的无用细节,不用记住冗长的函数名.在使用API时怎样避免使用者会 ...
- unity缓存和浏览器缓存
原地址:http://www.cnblogs.com/hisiqi/p/3203553.html <蒸汽之城>游戏中,为什么会黑屏?或者无法正常进入游戏? 我们在进行多项测试中发现少数用户 ...
- nginx reload
iwangzheng.com Usage: nginx [-?hvVt] [-s signal] [-c filename] [-p prefix] [-g directives] Options:- ...