我们知道,在学习源码的时候,最好能一步一步进行调试。之前在学习objc-runtime的源码,原本旧版本的代码已经编译完成了,但是更新系统之后再来看忽然又不行了。到网上一查,发现基本上都是基于旧版本。于是下载了最新的源码,重新进行编译,并记录自己在编译过程中碰到的各种问题,以供参考。本文使用的源码版本是objc-runtime-818.2, 使用的Xcode版本是12.4:
系统版本macOS Big Sur 11.1,
同时本文所有源码全部下载自
现在开始漫长的编译改错流程:
文章目录
- unable to find SDK
- sys/reason.h not found
- mach-o/dyld_priv.h not found
- os/lock_private.h not found
- os/base_private.h not found
- pthread/tsd_private.h not found
- cpu_capabilities.h not found
- os/tsd.h not found
- pthread/spinlock_private.h not found
- System/pthread_machdep.h not found
- CrashReporterClient.h not found
- CRGetCrashLogMessage undefined
- _simple.h not found
- Cambria not found
- os/linker_set.h not found
- os/feature_private.h not found
- Block_private.h not found
- objc-shared-cache.h not found
- kern/restartable.h not found
- os/reason_private.h not found
- os/variant_private.h not found
- Use of undeclared identifier 'dyld_fall_2020_os_versions'
- variant_private.h Expected','
- '_static_assert' declared as an array with a negative size
- Cannot open order file
- Library not found for
- 结束
- 头文件
unable to find SDK
首先碰到的问题是sdk问题,如图:
这个很简单,去对应的项目下,将Base SDK修改为macOS,如下图
修改前:
修改后:
同时在BuildPhasses下的Run Script(markgc)下展开,将macosx.internal修改为macosx, 如下所示:
sys/reason.h not found
该文件位于xnu/xnu-3789.21.4/bsd/sys/目录下,前往苹果开源网站下载xnu代码,在objc的源码目录下建立一个include文件夹,再建立一个sys目录,将该文件拖入,再前往objc的设置,修改Header Search Paths。
mach-o/dyld_priv.h not found
该文件位于 dyld/include/mach-o/ 目录下,同上下载dyld源码,然后从其中copy文件放入到对应的位置即可。
os/lock_private.h not found
该文件位于 libplatform/private/include/os/ 目录下,同上下载libplatform源码,copy文件到对应的位置即可。