objc-runtime源码编译
Posted 人生如梦91
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了objc-runtime源码编译相关的知识,希望对你有一定的参考价值。
我们知道,在学习源码的时候,最好能一步一步进行调试。之前在学习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文件到对应的位置即可。
os/base_private.h not found
该文件同样位于 xnu/libkern/os/ 目录下,同上copy对应文件即可
pthread/tsd_private.h not found
该文件位于 /libpthread/private/ 目录下,同上下载libpthread源码,copy相应的文件到对应的位置即可。
cpu_capabilities.h not found
该文件位于 xnu/osfmk/machine/ 目录下,同上复制对应的文件即可
os/tsd.h not found
该文件位于 xnu/libsyscall/os/ 目录中,同上copy文件到对应的目录即可
pthread/spinlock_private.h not found
该文件位于 libpthread/private/ 源码目录下,同样的复制即可。
System/pthread_machdep.h not found
这个文件位于 libc/pthreads/ 源代码下,同上下载源码复制到对应的目录下即可,如果最新的版本中没有,可以前往旧版本中寻找,Libc-583 版本中有该文件。
CrashReporterClient.h not found
该文件同样位于 libc/include/ 目录下,同上寻找即可。
CRGetCrashLogMessage undefined
这个错误报于objc-errors.mm文件中,首先在头部添加宏定义
#define LIBC_NO_LIBCRASHREPORTERCLIENT
上面已经有了CrashReporterClient.h,只要在对应的文件加上这句
#include"CrashReporterClient.h"
即可。
_simple.h not found
该文件位于 libplatform/private/ 目录下,同上寻找即可
Cambria not found
这两个文件在开源网站上找不到,可以注释掉头文件和源码objc-cache.mm第1121行~1128行,保留第1127行 即可。
os/linker_set.h not found
该文件位于 xnu/bsd/sys/ 目录下,同上复制即可
os/feature_private.h not found
这个文件似乎苹果并没有放出来,打开错误所在文件objc_runtime.mm,注释掉第36行和444~446行,如下所示:
Block_private.h not found
这个文件位于 libclosure 源码目录下,同上复制即可
objc-shared-cache.h not found
该文件位于 dyld/include/ 源码目录下,同上复制即可
kern/restartable.h not found
该文件位于 xnu/osfmk/kern/ 目录下,同上复制即可
os/reason_private.h not found
该文件位于 xnu/libkern/os/ 目录下,同上复制即可。
os/variant_private.h not found
该文件位于 libc/os/ 目录下,同上复制即可
Use of undeclared identifier ‘dyld_fall_2020_os_versions’
报这种相关错误的地方,目前可能将对应的代码全部注释。注释的地方有:
- objc-runtime.mm 第379~380行
- NSObject.mm 第1185~1188行
- objc-runtime-new.mm 第3547~3553行
- objc-runtime-new.mm 8325行initializeTaggedPointerObfuscator方法体中全部内容
variant_private.h Expected’,’
找到所有报这类错误的地方,然后将其中的 bridgeos 全部去除,去除的地方有:
- variant_private.h 第287行
但是我编译成功之后又不需要去除。
‘_static_assert’ declared as an array with a negative size
出错行位于objc-runtime-new.mm文件中第176~177行,将该行注释即可
Cannot open order file
跳转到BuildSettings,搜索order,将Order File修改为正确的路径。libobjc.order位于objc源码目录下,如下所示:
Library not found for
跳转到BuildSettings,然后将-lCrashReporterClient,-loah 删除
结束
经过这么多操作之后,objc库应该就能顺利编译成功了,最后在objc项目中新建一个target,然后就可以顺利的调试源代码了,下图是我在经过所有操作之后的效果:
头文件
最后放上编译该版本所需头文件,有需要的可以前往自取
objc4-required-headers
以上是关于objc-runtime源码编译的主要内容,如果未能解决你的问题,请参考以下文章