漳州手机网站开发,安全教育网站建设背景,长沙网络公司最新消息,国家高新技术企业认定条件和要求先阐述一下我的业务场景#xff0c;我有一个iOS的app sdk项目#xff0c;下面简称 A #xff0c;以及运行 A 的 app 项目#xff0c;简称 A demo 。 引用关系为 A demo 引用了 A #xff0c;而 A 引用了 ffmpeg 的静态库#xff08;.a文件#xff09;。此时业务出现了 b… 先阐述一下我的业务场景我有一个iOS的app sdk项目下面简称 A 以及运行 A 的 app 项目简称 A demo 。 引用关系为 A demo 引用了 A 而 A 引用了 ffmpeg 的静态库.a文件。此时业务出现了 bug 测试后得知bug 来自于ffmpeg。现在无法定位ffmpeg的问题出在哪里需要在程序运行时断点停在ffmpeg的源码中。而直接拉入ffmpeg是无法下断点的断点无效就是代码行数上那个虚线边框中心透明的图标。经过各种方式研究现在做出总结。 代码是公司的github就不放出来了 其实对于静态库的源码断点调试可以有三种方式 一、如果工程中有可执行文件可以直接调试源码例如ffmpeg的ffmpeg_g可执行文件缺点是与项目脱离无法从iOS项目中直接进入也可能是我没找到方法反正我是没成功。无法暂停项目的调试真的很难排查问题在哪。本文不讨论该方法 二、make生成有符号表的静态库文件项目A引用该文件并将静态库源码直接拉入工程。通过xcode断点调试。该方法可行但是不知道ffmpeg为什么不可以通过nm命令查看符号表也都正常。但就是不行。然后我选择了第三种方式 三、直接源码调试就是新建xcode 的静态库工程然后生成静态库后由A引用并在A工程中拉入ffmpeg的源码利用xcode设置断点。实测可以缺点就是编译ffmpeg时候会有很多奇怪的问题需要一一解决。我最后采用的就是这种方式。 针对第三种方法这种其实在逻辑上是最简单的首先需要新建一个xcode工程因为是我的是iOS项目所以我选的是 static library。把ffmpeg的文件夹拉入工程然后清空compile sources 后面会告诉你哪些需要拖入这个地方这个工程编译成功后就是.a静态库。然后在build configuration中设置为debug 。别忘了在header search中配置好路径不然会找不到文件这里很简单我就不赘述了不会的可以去百度。 因为ffmpeg是有多个静态库的建议一个target对应一个静态库方便管理和编译后面往项目A里也只需要拉动ffmpeg的哪个.xcodeproj 文件就行了。也很方便。最后弄好的工程界面应该是这样 那么ffmpeg那么多文件哪些文件是需要编译的这才是本文的重点。通常从ffmpeg官方库中下载的源代码会有一个可执行文件configure该文件的主要作用是生成一个可以用来make编译ffmpeg的config.h文件这个config才是最重要的它里面写了你所需要的配置需要编译哪些文件。他长这样 其实就是一堆宏定义。那么光看他怎么知道哪些文件是需要的还是不够的你还需要看对应静态库源码文件夹内的makefile文件因为ffmpeg是通过make编译而make就是通过config和makefile文件结合来排查那些文件编译的你需要把make编了哪些文件找到。举个例子比如我现在想编译libavutil.a这个库那么你就需要打开libavutil的目录下的makefile文件。见下图 这就很明显了,headers 后面的所有.h文件就是编译静态库后那个Headers文件夹里所有头文件那么就要把对应的文件拖入这里 这样就会在生成静态库时生成header文件夹了 对于.c文件的编译要在ffmpeg的makefile中找 objs 这个变量里有哪些文件这里每个.o就是对应.c文件编译过来的可以假装.o就是.c。 那你会注意到后面还有很多这样的代码 这里就是和config联动的地方我红色框出来的内容实际上就是config的宏定义在config中对应的是0或者1如果是1那么该行后面的出现的文件名就是要编译的如果是0那么就是不需要的。将上面所有需要的.c文件都拖入到这里注意别拖错target了
好有就是根据不同的平台要拖入对应的平台文件我是iOS项目也就是arm64要把汇编文件拖进去也就是.s文件其他的该目录下的.c一般不需要。 此时就可以 command b 编译了。但是会有很多报错我说一下我遇见的 如果下图报错那么说明你把不该编译的编译进来了例如这个tx_template.c去掉就可以了注意不是删除文件啊文件还在只是不编译了。 如果类似出现No matching function for call to av_pix_fmt_desc_get 就是缺少头文件查一下av_pix_fmt_desc_get 函数在哪个.h文件里一般都是internal.h 在上面添加#include就行了如果已经添加了还是报错那就说明没编译要把有av_pix_fmt_desc_get 对应的.c文件放入complie sources里。 对于编译其他库时候也会需要用到libavutil的internal.h加入把这个写进去就行了#include libavutil/internal.h注意head search目录得让他找得到 对于libavformat如果你引用了openssl 或者srt那么你还得添加依赖到link binary中并在library search配置好目录就行了。 对于avutil 源码编译时ffmpeg有自己的time.h 和time.c文件xcode会有可能出现于系统库里的time.c和time.h冲突导致报错例如 struct tm 、clock()、nanosleep无法找到但是头文件#include time.h明明添加了这就说明冲突了给ffmpeg 的time.c和time.h改名就行了。 如果编译成功了那么恭喜你完成了一大半。现在你可以在A中引入生成的静态库了然后编译A如果报错 Undefined symbol: _av_gettime 说明 av_gettime这函数、变量或者宏定义没找到你在ffmpeg中找到这个函数所在的.c文件然后拖到complie sources里重新编译就行了 上诉问题解决了大概率就能用了这时A工程的workspace中拖入ffmpeg的.xcodeproj文件然后在对应的位置设置断点就可以直接使用了。
从iOS Ademo 启动断点停在ffmpeg源码如下图