准备工作
编译环境 & objc源码
- macOS 10.15.6
- Xcode 11.4
- objc4-781
源码下载
1、苹果所有开源源码总地址,根据相应的版本查找对应的源码,以macOS 10.15为例:
macOS --> 10.15 --> 选择10.15 --> 搜索 objc
2、苹果源码直接下载地址,直接搜索想要下载的源码名称,例如objc
:直接搜索 objc --> objc4/ --> 选择相应的objc的版本
依赖文件下载
源码编译
1、unable to find sdk 'macosx.internal'
- 选择
target ->objc -> Build Setting -> Base SDK - > macOS
- 选择
target ->objc-trampolines -> Build Setting -> Base SDK - > macOS
2、'sys/reason.h' file not found
- 从 macOS10.15 下载
xnu-6153.11.26
,reason.h
文件的目录xnu-6153.11.26/bsd/sys/reason.h
- 在
objc4-781
目录下新建YPCommon
文件,并在YPCommon
文件下新建sys
,将下载的reason.h
文件添加到sys
中
- 设置
reason.h
路径,target -> objc -> Build Settings - > Header Search Paths
中 添加$(SRCROOT)/YPCommon
3、mach-o/dyld_priv.h' file not found
- 在YPCommon文件中创建
mach-o
文件 - 在开始准备的资源文件中找到
dyld-733.6 -> include -> mach-o -> dyld_priv.h
- 拷贝到新建的
mach-o
文件 - 打开
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
4、'os/lock_private.h' file not found
- 在
YPCommon
文件夹中新建os
文件 - 在下载的资源文件
libplatform-220 ->private -> os ->lock_private.h、base_private.h
两个文件,拷贝到新建的os
中
5、'pthread/tsd_private.h' file not found
和'pthread/spinlock_private.h' file not found
- 在
YPCommon
文件夹中新建pthread
文件 - 在下载的资源文件
libpthread-416.11.1 ->private ->tsd_private.h、spinlock_private.h
两个文件,拷贝到新建的pthread
中
6、'System/machine/cpu_capabilities.h' file not found
- 在
YPCommon
文件夹中新建System/machine
文件 - 在下载的资源文件
xnu6153.11.26 --> osfmk --> machine --> cpu_capabilities.h
文件,拷贝到System/machine
中
7、'os/tsd.h' file not found
- 在下载的资源文件
xnu6153.11.26 --> libsyscall --> os --> tsd.h
文件,拷贝到新建的YPCommon/os
中
8、'System/pthread_machdep.h' file not found
- 在下载的资源文件
Libc-583 --> pthreads --> pthread_machdep.h
文件,拷贝到YPCommon/System
中
9、'CrashReporterClient.h' file not found
- 在Libc-825.24 按路径
Libc-825.24/include/CrashReporterClient.h
找到对应文件导入YPCommon
目录下 - 在
target -> Build Setting -> Preprocessor Macros
中加入LIBC_NO_LIBCRASHREPORTERCLIENT
或者在CrashReporterClient.h
文件中更改了里面的宏信息#define LIBC_NO_LIBCRASHREPORTERCLIENT
10、'objc-shared-cache.h' file not found
- 在下载的资源文件
dyld-733.6 --> include --> objc-shared-cache.h
文件,拷贝到新建的YPCommon
目录下中
11、Mismatch in debug-ness macros
- 将
objc-runtime.mm
中#error mismatch in debug-ness macros
注释掉
12、'_simple.h' file not found
- 在下载的资源文件
libplatform-220 --> private --> _simple.h
文件,拷贝到新建的YPCommon
目录下中
13、'Block_private.h' file not found
- 在下载的资源文件
llibclosure-74 --> Block_private.h
文件,拷贝到新建的YPCommon
目录下中
14、'kern/restartable.h' file not found
- 在
YPCommon
文件夹中新建kern
文件 - 在下载的资源文件
xnu6153.11.26 --> osfmk --> kern --> restartable.h
文件,拷贝到新建的kern
中
15、can't open order file: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/AppleInternal/OrderFiles/libobjc.order
- 在
target -> objc -> Build Setting -> Order File
中添加搜索路径$(SRCROOT)/libobjc.order
16、/xcodebuild:1:1: SDK "macosx.internal" cannot be located.
- 在
target -> objc -> Build Phases -> Run Script(markgc)
把脚本文本里的macosx.internal
改成macosx
17、library not found for -lCrashReporterClient
- 在
target -> objc -> Build Settings -> Other -> Linker Flags -> Debug/Release -> Any macOS SDK
中删除-lCrashReporterClient
编译调试
- 新建一个
target
YPText
-
绑定依赖关系
源码调试
- 自定义一个
YPPerson
类 - 在main.m中 创建
YPPerson
的对象,就可以进行源码调试