当前位置: 首页 > news >正文

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源码如下图

相关文章:

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

先阐述一下我的业务场景&#xff0c;我有一个iOS的app sdk项目&#xff0c;下面简称 A &#xff0c;以及运行 A 的 app 项目&#xff0c;简称 A demo 。 引用关系为 A demo 引用了 A &#xff0c;而 A 引用了 ffmpeg 的静态库&#xff08;.a文件&#xff09;。此时业务出现了 b…...

机器学习06 数据准备-(利用 scikit-learn基于Pima Indian数据集作 数据特征选定)

什么是数据特征选定? 数据特征选定&#xff08;Feature Selection&#xff09;是指从原始数据中选择最相关、最有用的特征&#xff0c;用于构建机器学习模型。特征选定是机器学习流程中非常重要的一步&#xff0c;它直接影响模型的性能和泛化能力。通过选择最重要的特征&#…...

机器学习-特征选择:如何使用Lassco回归精确选择最佳特征?

一、引言 特征选择在机器学习领域中扮演着至关重要的角色&#xff0c;它能够从原始数据中选择最具信息量的特征&#xff0c;提高模型性能、减少过拟合&#xff0c;并加快模型训练和预测的速度。在大规模数据集和高维数据中&#xff0c;特征选择尤为重要&#xff0c;因为不必要的…...

SpringBoot之Actuator基本使用

SpringBoot之Actuator基本使用 引入分类常用接口含义healthbeansconditionsheapdumpmappingsthreaddumploggersmetrics 引入 <!-- actuator start--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter…...

排序算法(一)

1.冒泡排序-Bubble Sort 1.算法原理 依次比较相邻的两个元素&#xff0c;若按照从小到大的顺序&#xff0c;则将相邻元素中较大的一个放在后面&#xff1b;然后对每一对相邻元素都做这种比较&#xff0c;序列的最后一个元素就是最大的数&#xff1b; 2.算法复杂度 时间复杂度…...

Centos虚拟机忘记密码-修改密码

1.重启系统 2.在这个选择界面&#xff0c;按e建 3.找到如下位置&#xff0c;插入init/bin/sh 4.填写完成后按Ctrlx引导启动 5.输入mount -o remount, rw / (注意空格) 6.重置密码 出现以下为重置成功 7.执行touch /.autorelabel 8.退出exec /sbin/init 9.输入你的新密…...

Shell 分析服务器日志常用命令

1、查看有多少个IP访问&#xff1a; 日志文件的第一列是IP地址 awk {print $1} log_file|sort|uniq|wc -l2、查看某一个页面被访问的次数&#xff1a; grep "/index.php" log_file | wc -l3、查看每一个IP访问了多少个页面&#xff1a; awk {S[$1]} END {for (a i…...

mysql8配置binlog日志skip-log-bin,开启、关闭binlog,清理binlog日志文件

1.概要说明 binlog 就是binary log&#xff0c;二进制日志文件&#xff0c;这个文件记录了MySQL所有的DML操作。通过binlog日志我们可以做数据恢复&#xff0c;增量备份&#xff0c;主主复制和主从复制等等。对于开发者可能对binlog并不怎么关注&#xff0c;但是对于运维或者架…...

机器学习:训练集与测试集分割train_test_split

1 引言 在使用机器学习训练模型算法的过程中&#xff0c;为提高模型的泛化能力、防止过拟合等目的&#xff0c;需要将整体数据划分为训练集和测试集两部分&#xff0c;训练集用于模型训练&#xff0c;测试集用于模型的验证。此时&#xff0c;使用train_test_split函数可便捷高…...

淘宝API开发(一)简单介绍淘宝API功能接口作用

前一阵子按照上级指示&#xff0c;根据淘宝API开发符合自已应用的系统&#xff0c;比如批量上传&#xff0c;批量修改名称&#xff0c;价格等功能什么的&#xff0c;在此就将我的开发历程写一写&#xff0c;为自己前段时间的工作做个总结。 淘宝开发平台(淘宝网 - 淘&#xff…...

Redis相关面试题

Redis的使用场景 根据自己简历上的业务进行回答 缓存 穿透、击穿、雪崩、双写一致、持久化、数据过期、淘汰策略 分布式锁 setnx redisson 缓存穿透&#xff1a;查询一个不存在的数据&#xff0c;数据库查不到数据也不会直接写入缓存&#xff0c;就会导致每次请求都查询数据库…...

数据库简介

1、数据库安装: rpm (redhat package manager) 也是个包管理工具: rpm -ivh 安装 rpm -e 表示卸载,卸载的时候有可能出现依赖的问题,可以用 --nodeps 忽略依赖卸载。 rpm -qa 搜索系统中安装的rpm的应用。 如果使用离线包,安装顺序不要乱。 m…...

腾讯云国际轻量应用服务器怎么使用呢?

腾讯云国际轻量应用服务器怎么使用呢&#xff1f;下面一起来了解一下&#xff1a; 1. 熟悉轻量应用服务器基础知识 ①什么是轻量应用服务器 TencentCloud Lighthouse&#xff1f; ②轻量应用服务器与云服务器 CVM 的区别是什么&#xff1f; ③为什么选择轻量应用服务器&#xf…...

arm环境cloudstack在vpc下创建虚拟机失败

一、环境说明 操作系统&#xff1a;openEuler 22.03CPU&#xff1a;Kunpeng-920&#xff0c;arm v8cloudstack&#xff1a;4.18libvirtd&#xff1a;6.2.0 二、问题描述 在UI上创建VPC后&#xff0c;平台会同时创建一个virtual router&#xff0c;此时virtual router有两个网…...

Linux上安装Keepalived,多台Nginx配置Keepalived(保姆级教程)

目录 一、yum安装 第一步&#xff1a;下载 第二步&#xff1a;编辑Keepalived配置文件&#xff08;第一台&#xff09; 第三步&#xff1a;编辑Keepalived配置文件&#xff08;第二台&#xff09; 第四步&#xff1a;我们在本机利用cmd ping一下 一、yum安装 第一步&…...

centos7 ‘xxx‘ is not in the sudoers file...

如题 执行命令输入密码后时报错&#xff1a; [sudo] password for admin &#xff08;我的账户&#xff09;原因&#xff0c;当前用户还没有加入到root的配置文件中。 解决 vim打开配置文件&#xff0c;如下&#xff1a; #切换到root用户 su #编辑配置文件 vim /etc/sudoe…...

Zebec Payroll :计划推出 WageLink On-Demand Pay,进军薪酬发放领域

“Zebec Protocol 生态旨以 Web3 的方式建立全新的公平秩序&#xff0c;基于其流支付体系构建的薪酬支付板块&#xff0c;就是解决问题的一把利刃”...

【2023】字节跳动 10 日心动计划——第三关

目录 1. 最长有效括号2. 有序数组的平方 1. 最长有效括号 &#x1f517; 原题链接&#xff1a;32. 最长有效括号 类似于有效的括号&#xff0c;考虑用栈来解决。 具体来讲&#xff0c;我们始终保持栈底元素为当前已经遍历过的元素中「最后一个没有被匹配的右括号的下标」&…...

【无网络】win10更新后无法联网,有线无线都无法连接,且打开网络与Internet闪退

win10更新后无法联网&#xff0c;有线无线都无法连接&#xff0c;且打开网络与Internet闪退 法1 重新配置网络法2 更新驱动法3 修改注册表编辑器法4 重装系统 自从昨晚点了更新与重启后&#xff0c;今天电脑就再也不听话了&#xff0c;变着花样地连不上网。 检查路由器&#xf…...

HTML <script> 标签

实例 在 HTML 页面中插入一段 JavaScript: <script type="text/javascript"> document.write("Hello World!") </script>(在本页底部可以找到更多实例) 定义和用法 <script> 标签用于定义客户端脚本,比如 JavaScript。 script …...

HTML5+CSS3静态网页设计:从零搭建丝绸之路文化展示网站(学生作业实战)

HTML5CSS3静态网页设计实战&#xff1a;丝绸之路文化展示网站开发全流程 在数字化时代&#xff0c;传统文化如何通过网页设计焕发新生&#xff1f;对于计算机专业学生而言&#xff0c;将技术能力与文化主题结合的网页设计作业&#xff0c;不仅能展现编程水平&#xff0c;更是培…...

5分钟掌握BilibiliDown:新手快速上手的B站视频下载指南

5分钟掌握BilibiliDown&#xff1a;新手快速上手的B站视频下载指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader &#x1f633; 项目地址: https://gitcode.com/gh_mirrors/…...

从零解析ATK1218-BD:Arduino实战中的北斗/GPS数据获取与NMEA协议解读

1. 从零认识ATK1218-BD模块 第一次拿到这个火柴盒大小的北斗/GPS双模定位模块时&#xff0c;我完全没想到它能输出这么多信息。ATK1218-BD是正点原子推出的一款工业级定位模块&#xff0c;特别适合用在无人机、车载导航这些需要高精度定位的场景。和普通GPS模块最大的区别是它能…...

openclaw行为式AI重构:从昂贵Token到高效对象协作

从昂贵的token消耗到高效的对象协作,重新设计行为式AI的核心架构 问题诊断:为什么当前行为式AI如此“昂贵”? OpenClaw等工具的核心架构依赖生成式大模型作为“大脑”,通过反复的推理-行动循环完成任务。这种设计导致: 高Token消耗的根源 重复的上下文传递:每次循环都需…...

实战应用:基于快马平台构建项目级UI颜色规范管理工具

今天想和大家分享一个最近在项目中用到的实用工具——基于InsCode(快马)平台搭建的UI颜色规范管理系统。作为一个经常要和设计系统打交道的前端开发者&#xff0c;我发现在团队协作中&#xff0c;颜色代码的管理常常是个痛点&#xff0c;这次尝试用快马平台快速实现了一个解决方…...

readme-ai模板系统详解:如何创建自定义文档样式

readme-ai模板系统详解&#xff1a;如何创建自定义文档样式 【免费下载链接】readme-ai README file generator, powered by AI. 项目地址: https://gitcode.com/gh_mirrors/re/readme-ai 在当今开源项目中&#xff0c;专业的README文档是吸引用户和贡献者的关键。readm…...

解决SAP ABAP RFC外部调用调试难题:User权限与断点设置技巧

SAP ABAP RFC外部调用调试实战&#xff1a;权限配置与断点优化全指南 在SAP系统集成项目中&#xff0c;RFC&#xff08;Remote Function Call&#xff09;作为跨系统通信的核心技术&#xff0c;其调试过程往往让开发者头疼不已。想象一下这样的场景&#xff1a;你开发的RFC接口…...

插件语言转换解决方案:让Obsidian插件无缝支持中文界面

插件语言转换解决方案&#xff1a;让Obsidian插件无缝支持中文界面 【免费下载链接】obsidian-i18n 项目地址: https://gitcode.com/gh_mirrors/ob/obsidian-i18n obsidian-i18n&#xff08;国际化缩写&#xff09;是一款专为中文用户设计的Obsidian插件翻译工具&#…...

老Mac焕新实战:OpenCore Legacy Patcher全解析——让旧硬件重获新生

老Mac焕新实战&#xff1a;OpenCore Legacy Patcher全解析——让旧硬件重获新生 【免费下载链接】OpenCore-Legacy-Patcher Experience macOS just like before 项目地址: https://gitcode.com/GitHub_Trending/op/OpenCore-Legacy-Patcher 当你的Mac弹出"此Mac不支…...

Honey Select 2本地化增强补丁:技术实现与模块化架构深度解析

Honey Select 2本地化增强补丁&#xff1a;技术实现与模块化架构深度解析 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch HS2-HF Patch作为Honey Select 2游戏社…...