Windows下使用VS2010编译出带pdb可调试的FFmpeg库

本人主要在windows环境下开发,Linux下的gpb调试工具又不如vs调试方便(使用过其他调试工具才知道,vs果真为宇宙最强调试工具),所以决定在windows编译可以调试FFmpeg,以方便调试和学习FFmpeg内部代码。 有过在visual studio下编程的小伙伴应该都知道vs的调试信息主要依靠于pdb文件,那么我们今天编译的目的就是使FFmpeg的动态库生成相应的pdb文件。

1、首先要声明一下环境,windows7 64位+visual studio 2010 + MinGW,其他系统无碍,如果不是visual studio 2010环境的小伙伴可以略过这篇文章了。如果环境正确,接下来的步骤小伙伴们可要一步一步盯住了哦。

2、环境搭建

(1)下载文件
FFmpeg源码下载这里就不多说了,自己去下载哈
以下文件请按照具体情况下载(电脑64位的请下64位的)
C99-to-C89 Converter & Wrapper(Releases · libav/c99-to-c89 · GitHub)(如果无法下载请点这里)
Msinttypes(http://code.google.com/p/msinttypes/downloads/list)(如果无法下载请点这里)
MinGW,包含MSYS(MinGW - Minimalist GNU for Windows download | SourceForge.net)(如果无法下载请点这里)
YASM(Download - The Yasm Modular Assembler Project)(请下与系统环境对应的yasm-1.3.0,不是vsyasm,最近有些童鞋下载成vsyasm了如果无法下载请点这里)

(2)安装MinGW
下载好MinGW之后可以直接双击打开,按照默认的方式安装(建议默认安装,安装目录为C:\MinGW),此期间可能要下载一些文件,不同人因为网络的不同可能安装的时长也不相同。安装好之后返回桌面,双击快捷方式,打开界面如下(我的插件都已经安装好了,所以有绿色的部分):

如果你是第一次安装,请在和我同名的选项下右击,然后点Mark for Installation,全部选完之后点菜单栏的Installation->Apply Change,静静的等着下载吧。。。
(如果许久不能下载,你可以点这里,64位的哦)

安装好之后,如果上一步骤中MinGW安装的目录为C:/MinGW,则找到D:/MinGW/msys/1.0/msys.bat文件,右击编辑文件,在最前面加上一句话为(如果你下载的是我提供给你的MinGW,你一定要确认一下,路径是否正确):
call” C:\Program Files(x86)\MicrosoftVisual Studio 10.0\VC\bin\vcvars32.bat”
(C:\Program Files(x86)\MicrosoftVisual Studio 10.0\VC\bin\vcvars32.bat  这个路径为你自己的vs2010安装目录,如果是默认的安装目录你就按照上边的路径去找这个文件,每个人酌情而定,自己斟酌)
加好之后的效果如下:

(3)配置C99
配置好这个环境之后我们需要配置一下c99wrap环境(因为vs2010只支持到c89,不支持c99,所以这里要安装c99),将C99-to-C89压缩包里面的c99conv.exe、c99wrap.exe、makedef着三个文件复制到C:\MinGW\msys\1.0\bin(如果你下载的是我提供给你的压缩包,此步骤不用做,以防万一你要确认一下哦),配好之后的效果如下:

配置好c99后你不要动,在这个目录下(C:\MinGW\msys\1.0\bin)找到一个名为link.exe的文件,将他重命名一下(随便换个名字),目的是让他与vc的link.exe不冲突

配置好link之后,我们要配置一下yasm环境,将下载好的yasm-1.3.0.exe改名为yasm.exe,放入系统的运行目录下,此时你一定要注意32位和64位要对应,32位对应目录为C:\Windows\System32,64位对应目录为C:\Windows\SysWOW64,配置好的效果如下(本人的为64位系统):

这里你要注意了,这是环境配置的最后一步,也是最重要的一步,千万不要忘了将MinGW的bin目录加入到环境变量当中,具体操作为   我的电脑->右击->属性->高级设置->环境变量->Path  在末尾添加一项(如果此时末尾没有英文的分号,请记得添加之前加上英文的分号);添加的两个环境变量值分别为C:\MinGW\msys\1.0\bin和C:\MinGW\bin,添加好的效果如下:

(4)配置ffmpeg所需头文件
不要急着退出,此时你还需要新建一个名为INCLUDE的系统环境变量,变量值随意指向一个文件夹,这个文件夹下要装我们所下载的Msinttypes压缩包内的两个头文件,我的目录为D:\FFmpeg\include;
配置好之后的效果如下:

到这里,环境就算配置好了,你所需要做的就是重启电脑,不用担心重启好环境会崩溃哦,重启完之后我们将进入编译阶段哦。

3、编译
重启完电脑之后你需要找到Visual Studio x64 兼容工具命令提示(2010)这个工具,具体位置如图所示:

以管理员打开,进入你的MinGW安装目录,运行msys.bat,运行之后会弹出MinGW32工具,运行效果如图所示:

打开MinGW之后,我们需要进入FFmpeg源码根目录,使用命令./configure -h获取编译命令。如果有小伙伴对编译命令(./configure -h)命令不熟悉的,可以参考这篇文章:
编译FFmpeg是configure文件帮助选项详解
http://blog.csdn.net/u010380485/article/details/54089918

如果你要生成pdb文件,命令  --toolchain=msvc是必不可少的

注意,你在configure之前一定要记得修改根目录下的configure文件,让它支持c99,修改后的效果如下所示:

    [修改-根据本人的编译情况]本人使用的配置串如下:

./configure --enable-shared --enable-gpl  --toolchain=msvc --prefix="F:/ffmpeg-3.4.2/vs2010_build"

prefix选项后面给的是make install的发布路径,位于ffmpeg的根路径中,如果路径不存在,make install会自动创建目录。执行完make指令后,执行make install将头文件和库文件发布出来:

发布路径的文件层次结构如下:(层次结构由make install自动生成)

其中bin路径中就是我们要用的库文件:

路径中并没有拷贝pdb文件,可以自行到ffmpeg源码路径去找。

        使用编出来的库文件和对应的pdb文件,vs调试效果如下图所示:

4、注意事项
(1)因vs2010不识别c99语法,而ffmpeg内用了c99语法,我们需要配置c99的环境,与此同时,我们也需要让编译知道ffmpeg使用了c99语法,所以我们configure之前必须修改ffmpeg源码根目录的configure文件,否则你在编译FFmpeg的过程中会出现语法错误的现象,修改方法上边已附图。
(2)我编译过很多版本的FFmpeg,但是唯一在编译FFmpeg3.x版本出现了莫名其妙的错误,如果你也遇到了同样的问题,那么请注意这里,尝试把FFmpeg依赖的头文件stdint.h删除,可能是其与vs的相冲突而导致,删除后即可编译通过。
(3)如果你在修改别人的代码或者是需要libavresample.lib或.h这个文件,在configure之前记得一定要加上 –enable-avresample,否则将不会生成这个文件。
(4)在使用编译命令的时候请大家不要在configure的时候加上–enable-debug,如果加上会导致无法vs进入ffmpeg内部调试,谨记。
(5)如果编译好的库在引用的过程中出现
error C3861: ‘UINT64_C’: identifier not found
在common.h里加入定义如下:#ifndef INT64_C#define INT64_C(c) (c ## LL)#define UINT64_C(c) (c ## ULL)#endif(因在编写文章的时候加入回车键导致格式出问题,请添加的时候加入回车键)
(6)如果在编译中出现这个错误
错误 1 error C1189: #error : missing-D__STDC_CONSTANT_MACROS / #define__STDC_CONSTANT_MACROS

可以直接修改宏定义为#define __STDC_CONSTANT_MACROS

(7)[新增]最开始使用VS2010编译,来时提示下面的错误:

 libavdevice/avdevice.c(38) : error C2059: 语法错误:“.”libavdevice/avdevice.c(40) : error C2059: 语法错误:“,”libavdevice/avdevice.c(42) : error C2059: 语法错误:“,”libavdevice/avdevice.c(44) : error C2059: 语法错误:“,”libavdevice/avdevice.c(46) : error C2059: 语法错误:“,”libavdevice/avdevice.c(48) : error C2059: 语法错误:“,”libavdevice/avdevice.c(50) : error C2059: 语法错误:“,”libavdevice/avdevice.c(52) : error C2059: 语法错误:“,”libavdevice/avdevice.c(54) : error C2059: 语法错误:“,”libavdevice/avdevice.c(56) : error C2059: 语法错误:“}”libavdevice/avdevice.c(85) : fatal error C1903: 无法从以前的错误中恢复;正在停止编译make: *** [libavdevice/avdevice.o] Error 2

搜索到链接:https://www.cnblogs.com/wanggang123/p/6119534.html,说是VS2010支持C89,不支持C99,但是上面的准备步骤中已经将对C99的支持处理了,为啥还有这个问题呢?之前已经在MinGW的安装路径中MinGW\msys\1.0的msys.bat中指定了编译使用VS2010的批处理文件:

call "C:\Program Files\Microsoft Visual Studio 10.0\VC\bin\vcvars32.bat"

(8)[新增]2018年的ffmpeg-3.4.2版本在用VS2010编译时,会报链接不到va_copy函数的错误,这是C99中的函数,vs2010中是没有该函数的(VS2010只支持C89)。可以参考其他的开源代码,将va_copy重新定义一下即可,如下所示:

//在 Jansson-2.5 库中的 jansson_private.h 中有如下定义/* va_copy is a C99 feature. In C89 implementations, it's sometimesavailable as __va_copy. If not, memcpy() should do the trick. */
#ifndef va_copy
#ifdef __va_copy
#define va_copy __va_copy
#else
#define va_copy(a, b)  memcpy(&(a), &(b), sizeof(va_list))
#endif
#endif

(9)[新增]编译完成ffmpeg-3.4.2后,本来打算用ffpaly播放一个mp4视频,看看编出的库能否将视频播放出来,即验证编译出的ffmpeg库能否正常运行。但是发现目录中并没有生成ffplay.exe和ffserver.exe,经搜索得知,是Makefile中指定的config.mak(在ffmpeg根目录下)中:CONFIG_FFPLAY=yes和CONFIG_FFSERVER=yes开关没有打开,打开后重新make一下就好了(不用重新configure)

(10)[新增]ffmpeg在编译时是很娇气的,处理要做上述大量的配置准备工作,编译时还会有各式各样的问题。最开始使用VS2010编译老是出现(7)中的问题,考虑使用最新版本的VS2017来编译,可能新版的VS对C++的新特性支持的更好,但是安装后编译还是有一堆问题。后来尝试使用VS2013编译,也是一堆问题。好在最后使用VS2010编译出来了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/125692.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#,数值计算——完全VEGAS编码的蒙特·卡洛计算方法与源程序

1 文本格式 using System; namespace Legalsoft.Truffer { /// <summary> /// Complete VEGAS Code /// adaptive/recursive Monte Carlo /// </summary> public abstract class VEGAS { const int NDMX 50; const int …

基于微信小程序的付费自习室

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 文章目录 1 简介2 技术栈3 需求分析3.1用户需求分析3.1.1 学生用户3.1.3 管理员用户 4 数据库设计4.4.1 E…

【C++】一文带你走入vector

文章目录 一、vector的介绍二、vector的常用接口说明2.1 vector的使用2.2 vector iterator的使用2.3 vector空间增长问题2.4 vector 增删查改 三、总结 ヾ(๑╹◡╹)&#xff89;" 人总要为过去的懒惰而付出代价ヾ(๑╹◡╹)&#xff89;" 一、vector的介绍 vector…

【MyBatis-Plus】快速精通Mybatis-plus框架—快速入门

大家在日常开发中应该能发现&#xff0c;单表的CRUD功能代码重复度很高&#xff0c;也没有什么难度。而这部分代码量往往比较大&#xff0c;开发起来比较费时。 因此&#xff0c;目前企业中都会使用一些组件来简化或省略单表的CRUD开发工作。目前在国内使用较多的一个组件就是…

【VUE·疑难问题】定义 table 中每行的高度(使用 element-UI)

一、如何定义 table 中每一行的 height &#xff1f; 1.table例子 <!-- 二、table --><div style"overflow: hidden;display: block;height: 68vh;width: 100%;"><el-table stripe show-header style"width: 100%" :data"tableData&q…

代码随想录Day12 二叉树 LeetCode T102二叉树的层序遍历 T226 翻转二叉树 T101 对称二叉树

本文思路和详细讲解来自于:代码随想录 (programmercarl.com) LeetCode T102 二叉树的层序遍历 题目链接:102. 二叉树的层序遍历 - 力扣&#xff08;LeetCode&#xff09; 题目思路: 本题使用队列辅助完成,讲解主要函数CheckOrder:首先判断root是否为空,是就直接返回,然后创建…

互联网Java工程师面试题·Elasticsearch 篇·第一弹

目录 1、elasticsearch 了解多少&#xff0c;说说你们公司 es 的集群架构&#xff0c;索引数据大小&#xff0c;分片有多少&#xff0c;以及一些调优手段 。 1.1 设计阶段调优 1.2 写入调优 1.3 查询调优 1.4 其他调优 2、elasticsearch 的倒排索引是什么 3、elastic…

安卓教材学习

文章目录 教材学习第一行代码 Android 第3版环境配置gradle配置下载包出现问题 教材学习 摘要&#xff1a;选了几本教材《第一行代码 Android 第3版》&#xff0c;记录一下跑案例遇到的问题&#xff0c;和总结一些内容。 第一行代码 Android 第3版 环境配置 gradle配置 gradl…

【Overload游戏引擎分析】画场景网格的Shader

Overload引擎地址&#xff1a; GitHub - adriengivry/Overload: 3D Game engine with editor 一、栅格绘制基本原理 Overload Editor启动之后&#xff0c;场景视图中有栅格线&#xff0c;这个在很多软件中都有。刚开始我猜测它应该是通过绘制线实现的。阅读代码发现&#xff0…

MySQL:数据库的物理备份和恢复-冷备份(3)

介绍 物理备份&#xff1a; 直接复制数据文件进行的备份 优点&#xff1a;不需要其他的工具&#xff0c;直接复制就好&#xff0c;恢复直接复制备份文件即可 缺点&#xff1a;与存储引擎有关&#xff0c;跨平台能力较弱 逻辑备份&#xff1a; 从数据库中导出数据另存而进行的备…

【BBC新闻文章分类】使用 TF 2.0和 LSTM 的文本分类

一、说明 NLP上的许多创新是如何将上下文添加到词向量中。常见的方法之一是使用递归神经网络

全志ARM926 Melis2.0系统的开发指引⑧

全志ARM926 Melis2.0系统的开发指引⑧ 编写目的12.5. 应用程序编写12.5.1. 简单应用编写12.5.1.1. 注册应用12.5.1.2. 创建管理窗口12.5.1.3. 实现管理窗口消息处理回调函数12.5.1.4. 创建图层12.5.1.5. 创建 framewin12.5.1.6. 实现 framewin 消息处理回调函数 -. 全志相关工具…