xcode 的app工程与ffmpeg 4.4版本的静态库联调,ffmpeg内下的断点无法暂停。

        先阐述一下我的业务场景,我有一个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源码如下图

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

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

相关文章

jmeter中json提取器,获取多个值,并通过beanshell组成数组

jmeter中json提取器介绍 特别说明&#xff1a;**Compute concatenation var(suffix_ALL)&#x1f617;*如果找到许多结果&#xff0c;则插件将使用’ &#xff0c; 分隔符将它们连接起来&#xff0c;并将其存储在名为 _ALL的var中 json提取器调试 在查看结果树中选择JSON Pat…

2023,谁在引领实时互动进入高清时代?

实践是检验真理的唯一标准&#xff0c;技术是行业进步的核心动能。在实时互动的新时代里&#xff0c;不断进化的声网已然完成自证。 作者|斗斗 出品|产业家 “一个医疗行业的客户&#xff0c;曾向我们提出一个需求&#xff0c;希望在120急救场景下&#xff0c;可以远程看清…

docker search 镜像报错: connect: no route to host (桥接模式配置静态IP)

如下 原因 可能有多种&#xff1a; ① 没有开放防火墙端口 ② ip地址配置有误 解决 我是因为虚拟机采用了桥接模式&#xff0c;配置静态ip地址有问题。 先确认虚拟机采用的是 桥接模式&#xff0c;然后启动虚拟机。 1、打开命令行&#xff0c;输入下面指令&#xff0c;打开…

[论文笔记] chatgpt系列 2.6 DeepSpeed-chat 数据集

一、FT数据集 & Reward model数据集 Deepspeed-chat 源代码的数据集: Dahoas/rm-static: 这是一个用于强化学习的静态环境数据集,包含了一个机器人在一个固定环境中的运动轨迹。该数据集旨在用于评估强化学习算法在静态环境下的表现。 Dahoas/full-hh-rlhf: 这是一个用于…

6.4.tensorRT高级(1)-UNet分割模型导出、编译到推理(无封装)

目录 前言1. Unet导出2. Unet推理总结 前言 杜老师推出的 tensorRT从零起步高性能部署 课程&#xff0c;之前有看过一遍&#xff0c;但是没有做笔记&#xff0c;很多东西也忘了。这次重新撸一遍&#xff0c;顺便记记笔记。 本次课程学习 tensorRT 高级-Unet分割模型导出、编译到…

docker 安装 字体文件

先说一下我当前的 场景 及 环境&#xff0c;这样同学们可以先评估本篇文章是否有帮助。 环境&#xff1a; dockerphp8.1-fpmwindows 之所以有 php&#xff0c;是因为这个功能是使用 php 开发的&#xff0c;其他语言的同学&#xff0c;如果也有使用到 字体文件&#xff0c;那么…

微前端中的 CSS

本文为翻译 本文译者为 360 奇舞团前端开发工程师原文标题&#xff1a;CSS in Micro Frontends 原文作者&#xff1a;Florian Rappl 原文地址&#xff1a;https://dev.to/florianrappl/css-in-micro-frontends-4jai 我被问得最多的问题之一是如何在微前端中处理 CSS。毕竟&…

VLE基于预训练文本和图像编码器的图像-文本多模态理解模型:支持视觉问答、图文匹配、图片分类、常识推理等

项目设计集合&#xff08;人工智能方向&#xff09;&#xff1a;助力新人快速实战掌握技能、自主完成项目设计升级&#xff0c;提升自身的硬实力&#xff08;不仅限NLP、知识图谱、计算机视觉等领域&#xff09;&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实…

VSCode---通过ctrl+鼠标滚动改变字体大小

打开设置然后在右边输editor.mouseWheelZoo勾选即可实现鼠标滚动改变字体大小 4.这种设置的字体大小是固定的

A Survey of Embodied AI: From Simulators to Research Tasks 论文阅读

论文信息&#xff1a; 题目&#xff1a;A Survey of Embodied AI: From Simulators to Research Tasks 作者&#xff1a;Jiafei Duan, Samson Yu 来源&#xff1a;arXiv 时间&#xff1a;2022 Abstract 通过评估当前的九个具体人工智能模拟器与我们提出的七个功能&#xff0…

MATLAB(R2023a)添加工具箱TooLbox的方法-以GPOPS为例

一、找到工具箱存放位置 首先我们需要找到工具箱的存放位置&#xff0c;点击这个设置路径可以看到 我们的matlab工具箱的存放位置 C:\Program Files\MATLAB\R2023a\toolbox\matlab 从资源管理器中打开这个位置&#xff0c;可以看到里面各种工具箱 二、放入工具箱 解压我们…

Windows11 家庭中文版关于本地组策略编辑器gpedit.msc找不到即打不开的解决办法(征诚小张售后实测有效)

Windows11 家庭中文版关于本地组策略编辑器gpedit.msc找不到即打不开的解决办法 根本原因&#xff1a;是因为Windows11家庭中文版的 版本系统没内置安装本地策略组编辑器 好了废话不多说 直接说解决办法 第一步 首先电脑上新建一个空文本文件 输入以下内容&#xff1a; echo o…

STM32 4G学习

硬件连接 ATK-IDM750C模块可直接与正点原子 MiniSTM32F103开发板板载的ATK模块接口&#xff08;ATK-MODULE&#xff09;进行连接。 功能说明 ATK-IDM750C是正点原子&#xff08;ALIENTEK&#xff09;团队开发的一款高性能4G Cat1 DTU产品&#xff0c;支持移动4G、联通4G和…

ChatGPT已闯入学术界,Elsevier推出AI工具

2022年11月&#xff0c;OpenAI公司发布了ChatGPT&#xff0c;这是迄今为止人工智能在现实世界中最重要的应用之一。 当前&#xff0c;互联网搜索引擎中出现了越来越多的人工智能&#xff08;AI&#xff09;聊天机器人&#xff0c;例如谷歌的Bard和微软的Bing&#xff0c;看起来…

Lombok 的安装与使用

文章目录 一、什么是 Lombok1.1 Lombok 的概念1.2 为什么使用 Lombok1.3 Lombok 的相关注解 二、Lombok 的安装2.1 引入依赖2.2 安装插件 三、Lombok 的使用案例四、Lombok 的原理 一、什么是 Lombok 1.1 Lombok 的概念 Lombok&#xff08;“Project Lombok”&#xff09;是一…

MySQL 窗口函数

聚合函数作为窗口函数 设聚合函数为op语法结构&#xff1a; op(字段名A) over(partition by 字段名B order by 字段名C rows between D1 and D2) 其中&#xff1a; partition by&#xff1a;按照某一字段将数据进行分组 order by&#xff1a;按照某一字段将数据进行排序&…

Java实现八皇后问题

八皇后问题说明 八皇后问题&#xff0c;是一个古老而著名的问题&#xff0c;是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯贝瑟尔于 1848 年提出&#xff1a;在 88 格的国际象棋上摆放八个皇后&#xff0c;使其不能互相攻击&#xff0c;即&#xff1a;任意两个皇后都不…

筛选给定范围内的日志

目录 1.时间戳 2.实例 1.首先创建ubuntu.log日志 2.写dem.awk创建规则 3.筛选 1.时间戳 一个能表示一份数据在某个特定时间之前已经存在的、 完整的、 可验证的数据,通常是一个字符序列&#xff0c;唯一地标识某一刻的时间。 awk提供了mktime()函数&#xff0c;它可以将时间…

31 对集合中的字符串,按照长度降序排列

思路&#xff1a;使用集合的sort方法&#xff0c;新建一个Comparator接口&#xff0c;泛型是<String>&#xff0c;重写里面的compare方法。 package jiang.com; import java.util.Arrays; import java.util.Comparator; import java.util.List;public class Practice4 {…

WSL 2 installation is incomplete的解决方案

问题描述 解决方案 在Windows功能中开启Hyper-v 如果没有Hyper-v选项&#xff0c;新建文本粘贴以下内容后以.cmd为后缀保存后执行即可 pushd "%~dp0" dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt for /f %%i in (findstr /i . hyper-v.t…