iOS_objc4-818.2最新源码编译调试
很多小伙伴在探索底层的时候经常很苦恼,只能靠猜测!稍微灵活一点的小伙伴会通过
Apple
提供的源码来辅助看一下,但是很显然这不太直观!如果能够直接编译调试,像我们自己的代码直接LLDB
调试,流程跟踪。那简直不要太爽,于是我编译了现在最新的iOS_objc4-818.2
。
一. 准备工作
- xcode 12.4
- 下载objc源码
- 打开下载的源码
二. 开始配置
1. 问题:macOS版本处理
解决方案:修改源码编译环境
macOS
2. 问题:i386 架构问题
解决方案:将
objc
和objc-trampolines
中的Build Settings
选项Architectures
中的值切换为Standard Architectures(64-bit Intel)
3. 问题:文件查漏补缺
’sys/reason.h' file not found
解决方案:添加缺失的文件
- 通过 Gitee 源码 下载,路径在 objc4-818.2/ZLCommon/sys/reason.h 自行下载
- 把找到的文件加入到工程里面。例如:
- 根目录创建了一个
ZLCommon
文件夹- 创建
sys
文件夹- 把
reason.h
文件加进去- 配置文件检索路径。如下:
- 选择
target
->objc
->Build Settings
- 在工程的
Header Serach Paths
中添加搜索路径$(SRCROOT)/ZLCommon
。
'mach-o/dyld_priv.h' file not found
'os/lock_private.h' file not found
'os/base_private.h' file not found
'os/tsd.h' file not found
'pthread/tsd_private.h' file not found
'pthread/spinlock_private.h' file not found
'System/machine/cpu_capabilities.h' file not found
'System/pthread_machdep.h' file not found
'CrashReporterClient.h' file not found
'objc-shared-cache.h' file not found
'_simple.h' file not found
'Block_private.h' file not found
上面的报错情况处理方式一致,此处不在一一介绍。
注意:如果没有所需要的文件,有两种处理方式:
- 直接注释掉即可,例如:
'os/feature_private.h' file not found
- 到 Apple Source 里面下载最新的
xnu
包。不过这种方式不太方便,我们并不知道缺失的文件是属于哪个库,建议把小编提供的源码的文件下载导入,其他的如果报错就直接注释掉。
4. 问题:CrashReporterClient
'CrashReporterClient.h' file not found
解决方案:需要在
Build Settings
->Preprocessor Macros
中加入:LIBC_NO_LIBCRASHREPORTERCLIENT
5. 问题:_static_assert异常
'_static_assert' declared as an array with a negative size
解决方案:直接注释掉即可
6. 问题:libobjc.order 路径问题
解决方案:
- 选择
target
->objc
->Build Settings
- 在工程的
Order File
中添加搜索路径$(SRCROOT)/libobjc.order
7. 问题:lCrashReporterClient 编译不到
Library not found for -lCrashReporterClient
解决方案:
- 选择
target
->objc
->Build Settings
- 在
Other Linker Flags
中删除-lCrashReporterClient
(Debug
和Release
都删了)- 如果出现了
Library not found for -loah
的错误,处理方式一致。
8. 问题:Xcode 脚本编译问题
`/xcodebuild:1:1: SDK "macosx.internal" cannot be located.
解决方案:
- 选择
target
->objc
->Build Settings
->Run Script(markgc)
- 把脚本文本
macosx.internal
改成macosx
9. 问题:ObjectiveC.apinotes 异常
no such public header file: '/tmp/objc.dst/usr/include/objc/ObjectiveC.apinotes'
解决方案:
- 选择
target
->objc
->Build Settings
Text-Based InstallAPI Verification Model
中添加搜索路径Errors Only
Other Text-Based InstallAPI Flags
清空所有内容
10. 问题:_objc_opt_class 无法编译
Undefined symbol: _objc_opt_class
解决方案:
这个问题是因为要适配新系统
MacOS 10.15
,因为现在笔者写这一篇文章的时候,还没有正式版本推送!这里我们向下兼容MacOS 10.14
三. 编译调试
1. 创建一个Target
2. 绑定依赖关系
3. main.m
必须放到第一位
大功告成,如果没什么问题的话,可以编译成功了。