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

首先碰到的问题是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’


报这种相关错误的地方,目前可能将对应的代码全部注释。注释的地方有:

  1. objc-runtime.mm 第379~380行
  2. NSObject.mm 第1185~1188行
  3. objc-runtime-new.mm 第3547~3553行
  4. objc-runtime-new.mm 8325行initializeTaggedPointerObfuscator方法体中全部内容

variant_private.h Expected’,’


找到所有报这类错误的地方,然后将其中的 bridgeos 全部去除,去除的地方有:

  1. 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源码编译的主要内容,如果未能解决你的问题,请参考以下文章

源码编译安装httpd

Flink源码编译

源码包安装

FastDFS源码学习FastDFS介绍及源码编译安装

web网站服务

Centos7通过yum跟源码编译安装Nginx