iOS底层原理:苹果开源 objc4-818 源码项目的编译和调试(一)

简介: 作为一名iOS程序员,探索OC底层原理永不止息,同时也是永远的痛,最开始只能靠猜测!后面慢慢找到了苹果官方开源的源码来辅助看一下,但是尽管这样,还是显得不太直观!如果objc源码能够像我们自己创建的项目一样直接编译调试,像我们自己的代码一样能够直接 LLDB 调试,流程跟踪,那简直不要太爽。废话不多说,开炮~ 哦,不是,是开干~!🚀

image.png

开篇


作为一名iOS程序员,探索OC底层原理永不止息,同时也是永远的痛,最开始只能靠猜测!后面慢慢找到了苹果官方开源的源码来辅助看一下,但是尽管这样,还是显得不太直观!如果objc源码能够像我们自己创建的项目一样直接编译调试,像我们自己的代码一样能够直接 LLDB 调试,流程跟踪,那简直不要太爽。废话不多说,开炮~ 哦,不是,是开干~!🚀


一、准备工作


苹果官方开源源码地址:
  1. https://opensource.apple.com/releases/


image.png


  1. https://opensource.apple.com/tarballs/objc4/


image.png


上面这两种方式,自行下载即可。我这里下载的是目前最新的objc4-818.2版本!


系统版本、开发工具、objc源码


  • macOS Big Sur 11.1
  • Xcode 12.5.1
  • objc4-818.2


依赖文件


dyld-852.2macOS 11.5

Libc-825.40.1Mac OS X 10.8.5

Libc-1439.141.1macOS 11.5

libclosure-79macOS 11.3 ~ macOS 11.5

libplatform-254.80.2macOS 11.2 ~ macOS 11.5

libplatform-220.100.1macOS 10.15.4~macOS 10.15.6

libpthread-454.120.2macOS 11.4~macOS 11.5

xnu-7195.141.2macOS 11.5


image.png

以上是依赖源文件库的版本,可以到官方Open Source上去下载,如图:


image.png

也可以直接点击上面对应的文件名跳转到GitHub上,然后再下载,比如:dyld-852.2,GitHub结果如图:


image.png

注意:建议依赖的文件库最好去官方Open Source上去下载,这样可以帮助你了解官方网站的玩法,并且版本尽量下载最新版,在macOS新版本找不到对应的文件库就从之前的macOS版本去找


二、objc源码项目编译和遇到问题解决


下载好objc4-818.2的源码后,解压后打开objc.xcodeproj


image.png

然后选中objc这个target进行编译


image.png


注意:以下错误顺序不分先后,我只是按照我这边遇到错误的顺序依次解决,小伙伴们如果遇到问题对应不上的,可以往前或往后翻一翻,对照相应的错误进行解决


报错1:'unable to find sdk 'macosx.internal'

第一次编译会出现两个'unable to find sdk 'macosx.internal'的报错,objc 和 objc-trampolines 这两个target都有这个问题。


image.png



解决方式:

  • 找到BuildSettings,分别设置 objc、objc-trampolines的Base SDK为macOS。


target -> objc -> BuildSettings -> Base SDK -> macOS
target -> objc-trampolines -> BuildSettings -> Base SDK -> macOS



image.png

报错2:'sys/reason.h' file not found

再次运行,出现'sys/reason.h' file not found错误


image.png

这个reason.h文件在哪儿呢?这时候就需要用到我们前面下载的文件依赖库了。reason.h就在下载的文件库 xnu-7195.141.2/bsd/sys目录下。

解决方式:


  1. objc4-818.2工程的根目录下新建一个名为JQDependencies(文件名随便取)的文件夹,然后JQDependencies下创建子文件夹sys


  1. xnu-7195.141.2/bsd/sys目录下的reason.h文件copy到JQDependencies/sys/目录下


  1. 然后设置一下文件的搜索路径 Header Search Paths


image.png

image.png


image.png

报错3:'mach-o/dyld_priv.h' file not found


再次运行,会出现'mach-o/dyld_priv.h' file not found这个错误


image.png


这个报错和错误2是同样的道理,是缺少了dyld_priv.h这个文件,dyld_priv.h文件在在dyld-852.2/include/mach-o目录下


解决方式:


  1. JQDependencies目录下同样创建一个mach-o文件夹


  1. dyld_priv.hdyld-852.2/include/mach-o目录下copy到JQDependencies/mach-o目录下


image.png


image.png


  1. 拷贝之后还需要在 dyld_priv.h 文件添加以下宏定义


#define DYLD_MACOSX_VERSION_10_11 0x000A0B00
#define DYLD_MACOSX_VERSION_10_12 0x000A0C00
#define DYLD_MACOSX_VERSION_10_13 0x000A0D00
#define DYLD_MACOSX_VERSION_10_14 0x000A0E00


image.png

然后在项目中点击#   include 跳转到dyld_priv.h文件中,查看其中是否有 bridgeos(3.0) 的函数参数报错,如果有报错则删除bridgeos(3.0)参数。


image.png


image.png

报错4:'os/lock_private.h' file not found

再次编译运行,会出现'os/lock_private.h' file not found错误


image.png

同理,我们在依赖库中找到文件位置,创建对应文件路径并将目标文件copy到对应的路径下即可。lock_private.h文件在libplatform-254.80.2/private/os目录下


解决方式:


  1. JQDependencies目录下同样创建一个os文件夹


  1. lock_private.hlibplatform-254.80.2/private/os目录下copy到JQDependencies/os目录下
    此处就不贴图了,按照报错2的方式去对应的路径下找文件即可。
报错5:'os/base_private.h' file not found

再次编译运行,会出现'os/base_private.h' file not found错误

同理,我们在依赖库中找到文件位置,创建对应文件路径并将目标文件copy到对应的路径下即可。base_private.h文件在libplatform-254.80.2/private/os目录下

解决方式:


  1. base_private.hlibplatform-254.80.2/private/os目录下copy到JQDependencies/os目录下


报错6:'pthread/tsd_private.h' file not found


再次编译运行,会出现 'pthread/tsd_private.h' file not found错误

同理,我们在依赖库中找到文件位置,创建对应文件路径并将目标文件copy到对应的路径下即可。tsd_private.h文件在libpthread-libpthread-454.120.2/private/pthread*目录下

解决方式:

  1. JQDependencies目录下同样创建一个pthread文件夹


  1. tsd_private.hlibpthread-libpthread-454.120.2/private/pthread目录下copy到JQDependencies/pthread目录下


报错7:'pthread/spinlock_private.h' file not found


同理,我们在依赖库中找到文件位置,创建对应文件路径并将目标文件copy到对应的路径下即可。spinlock_private.h文件也在libpthread-libpthread-454.120.2/private/pthread*目录下


解决方式:


  1. spinlock_private.hlibpthread-libpthread-454.120.2/private/pthread目录下copy到JQDependencies/pthread目录下
报错8:'System/machine/cpu_capabilities.h' file not found

同样是找到文件位置,cpu_capabilities.h文件在xnu-7195.141.2/osfmk/machine目录下


解决方式:


  1. JQDependencies目录下同样创建一个System/machine文件夹。


  1. cpu_capabilities.hxnu-7195.141.2/osfmk/machine目录下copy到JQDependencies/System/machine/目录下


这里要注意的是:上面的文件丢失都是创建的单层文件夹,这里是System和machine两层文件夹,主要是看报错提示的路径,比


如:'System/machine/cpu_capabilities.h'需要的System/machine/两层


相关文章
|
1月前
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
112 1
|
2月前
|
IDE Android开发 iOS开发
探索Android与iOS开发的差异:平台选择对项目成功的影响
【9月更文挑战第27天】在移动应用开发的世界中,Android和iOS是两个主要的操作系统平台。每个系统都有其独特的开发环境、工具和用户群体。本文将深入探讨这两个平台的关键差异点,并分析这些差异如何影响应用的性能、用户体验和最终的市场表现。通过对比分析,我们将揭示选择正确的开发平台对于确保项目成功的重要作用。
|
27天前
|
移动开发 网络协议 小程序
基于开源IM即时通讯框架MobileIMSDK:RainbowChat-iOS端v9.1版已发布
RainbowChat是一套基于开源IM聊天框架 MobileIMSDK 的产品级移动端IM系统。RainbowChat源于真实运营的产品,解决了大量的屏幕适配、细节优化、机器兼容问题
55 5
|
2月前
|
IDE 开发工具 Android开发
安卓与iOS开发对比:平台选择对项目成功的影响
【9月更文挑战第10天】在移动应用开发的世界中,选择正确的平台是至关重要的。本文将深入探讨安卓和iOS这两大主要移动操作系统的开发环境,通过比较它们的市场份额、开发工具、编程语言和用户群体等方面,为开发者提供一个清晰的指南。我们将分析这两个平台的优势和劣势,并讨论如何根据项目需求和目标受众来做出最佳选择。无论你是初学者还是有经验的开发者,这篇文章都将帮助你更好地理解每个平台的特性,并指导你做出明智的决策。
|
2月前
|
Java 开发工具 Android开发
安卓与iOS开发:平台选择对项目成功的影响
在移动应用开发的浩瀚宇宙中,安卓和iOS两大星系璀璨夺目,各自拥有独特的光芒。本文将穿梭于这两个平台之间,探讨它们在开发环境、用户群体、成本效益等方面的差异,以及这些差异如何影响一个项目的航向和终点。我们将从初学者的视角出发,逐步深入,揭示选择合适平台的重要性,以及如何根据项目需求做出明智的选择。无论你是即将启航的新手开发者,还是已经在这片星海中航行的老手,这篇文章都将为你提供有价值的导航信息。
56 2
|
2月前
|
Java 开发工具 Android开发
探索安卓与iOS开发的差异:平台选择对项目的影响
在移动应用开发的广阔天地中,安卓和iOS两大平台各自占据着重要的位置。本文旨在深入探讨这两个平台在开发过程中的主要差异,包括编程语言、开发工具、用户界面设计、性能优化以及市场分布等方面。通过对比分析,我们将揭示平台选择如何影响项目规划、执行效率和最终成果,为开发者在选择适合自己项目需求的平台时提供参考依据。
|
3月前
|
IDE 开发工具 Android开发
探索iOS与安卓开发的差异:平台选择对项目成功的影响
【8月更文挑战第22天】在数字化时代,移动应用成为企业和个人展示创意、提供服务的重要工具。iOS和安卓作为两大主流平台,各自拥有独特的优势和限制。本文将深入探讨这两个平台在开发过程中的主要差异,以及这些差异如何影响项目规划、用户体验和市场策略。通过比较分析,旨在为开发者和企业决策者提供有价值的见解,帮助他们根据项目需求做出明智的平台选择。
|
3天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
10天前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
32 9