xcode修改时间后就要重新编译_揭秘NSRuntime源码编译

C语言,函数的调用在编译的时候会决定调用哪个函数。编译完成之后直接顺序执行,无任何二义性。而OC的函数调用成为消息发送。属于动态调用过程。在编译的时候并不能决定真正调用哪个函数(事实证明,在编 译阶段,OC可以调用任何函数,即使这个函数并未实现,只要申明过就不会报错。而C语言在编译阶段就会报错)。只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。

我们如何找到RunTime源码?

Runtime源码下载链接:https://opensource.apple.com/release/macos-10141.html

打开链接,搜索objc 找到objc4最新版本下载即可。

本文编译环境

1、 Xcode版本:11.2.1

2、 MacOS版本:10.14.6

3、 Runtime版本:objc4-750.1

对于不同的Runtime版本及Xcode版本可能出现的错误也不一样,这篇文章主要是我在编译过程中遇到的错误信息以及解决方案,如果大家没有遇到对应的错误信息,直接跳过即可。

编译过程

打开objc.xcodeproj,编译运行,

1、编译报错:

35c5335f62d2874117ec06114ad0a0bc.png

解决方案:按图中步骤将Architectures选择Stand Architectures,点击objc target,也如下图修改。

dec66e5b5ece88802fb47e379be8c3b4.png

2、编译报错,会缺少很多的文件

第一步:打开链接https://opensource.apple.com/release/macos-10141.html 下载:Libc、dyld、libauto、libclosure、libdispatch、xnu、libpthread、launchd、libplatform,全部下载下来解压到统一个目录下。

第二步:新建文件夹Common,之后我们会把所有的报错文件都放到该文件夹下。

第三步:Header search path,debug及release下添加$(SRCROOT)/Common,如下图。

f696ba12f0886b817663300597d8c397.png

第四步:逐步编译添加缺少的文件。

报错1:'reason.h' file not found

解决方案:打开终端,cd到第一步中统一的目录下,执行命令:find . -name 'reason.h' ,

终端打印./xnu-4570.71.2/bsd/sys/reason.h

在Common目录下新建sys文件夹,到文件夹下该文件夹下找到reason.h 添加到项目sys文件夹下,继续编译。

报错2:'dyld_priv.h' file not found,所在路径:./dyld-655.1.1/include/mach-o/dyld_priv.h,

添加后会在dyld_priv.h文件中报错Expected ',' 注释掉即可

*通上述步骤可找到文件添加到工程,为节省大家时间,相同的操作会列出缺少文件及对应找的目录

报错3:'lock_private.h' file not found

路径:./libplatform177.200.16/private/os/lock_private.h

报错4:'base_private.h' file not found

路径:./libplatform177.200.16/private/os/base_private.h

报错5:'tsd_private.h' file not found

路径:./libpthread-330.250.2/private/tsd_private.h

报错6:'cpu_capabilities.h' file not found

如果执行find . -name 'cpu_capabilities.h'会有三个文件,我们用./xnu-4570.71.2/osfmk/machine/cpu_capabilities.h 目录下文件

报错7:'tsd.h' file not found

会有两个文件,我们用:./xnu-4570.71.2/libsyscall/os/tsd.h

报错8:'spinlock_private.h' file not found

路径./libpthread-330.250.2/private/spinlock_private.h

报错9:'pthread_machdep.h' file not found

采用上述方案找不到该文件,我们需要采取新的方案,即在google搜索pthread_machdep打开第一条,自己在Common/System下新建文件,将内容拷贝进去。

拷贝后会报错:Typedef redefinition with different types ('int' vs 'volatile OSSpinLock' (aka 'volatile int')) 解决方案 将该文件中报错的地方注释掉

*注意如果注释不全这会报错-如果没有下图报错跳过次步骤

2b985a3c0ce0022e1c70cfd66af5411b.png

解决方案:一定将pthread_machdep.h文件中inline static int 这行代码注释掉

错误10:'CrashReporterClient.h' file not found

同报错9一样的方式解决,

错误11:'Block_private.h' file not found

路径./libclosure-73/Block_private.h对应目录./libdispatch-1008.250.7/src/BlocksRuntime/Block_private.h

错误12:'objc-shared-cache.h' file not found

路径:./dyld-655.1.1/include/objc-shared-cache.h

错误13:'_simple.h' file not found

路径./libplatform-177.200.16/private/_simple.h

错误14:'dyld_priv.h' file not found

路径./dyld-655.1.1/include/mach-o/dyld_priv.h

错误15:'isa.h' file not found

路径./objc4-750.1/runtime/isa.h

3、编译报错:

Use of undeclared identifier ‘CRGetCrashLogMessage’

解决方法:target -> Build Settings -> Preprocessor Macros 添加LIBC_NO_LIBCRASHREPORTERCLIENT,如下图。

4ddb35007f383bb8dd54ae769528c83e.png

4、编译报错:

Use of undeclared identifier 'DYLD_MACOSX_VERSION_10_13'

解决方案:在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

如下图:

7a0320ecf2fc78b61dd284090284ab17.png

5、继续编译报错:

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 Settings -> Order File

加入:$(SRCROOT)/libobjc.order,如下图:

ee52d153c86e76992d3e73693f00dcfd.png

6、继续编译报错:

library not found for -lCrashReporterClient

解决方法:删除lCrashReporterClient,如下图:

377c0cc816fa92be798a85923c0ce2e7.png

7、继续编译报错:

Undefined symbol: _objc_opt_class:

解决方法:

5669a262c0ceb80f3ae98da970328612.png

8、继续编译报错:

77f514bfe2d3f56a8c44b1b8b35c4b89.png

•解决方法:选择 target -> objc -> Build Phases -> Run Script(markgc)

•把脚本文本 macosx.internal 改成 macosx

9、继续编译报错:

error: no such public header file: '/tmp/objc.dst/usr/include/objc/ObjectiveC.apinotes'

解决方法:选择 target -> objc -> Build Settings

•Text-Based InstallAPI Verification Model 中添加搜索路径 Errors Only

将Supports Text-Based Install API 设为NO

5c045dfdf88b094ad1f4b2be963f0891.png

编译通过

新建Target:runtimeTest 运行runtimeTest,runtimeTest下main.m文件里可以断点查看runtime源码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你在使用 Xcode 14.3.1 进行打包编译时遇到缓慢的问题,以下是一些可能的解决方法: 1. 清理 Derived Data:在 Xcode 的菜单栏中选择 "File" -> "Workspace Settings",然后在弹出的窗口中点击 "Derived Data" 的位置旁边的箭头图标,打开 Derived Data 文件夹。在 Finder 中删除 Derived Data 文件夹中的内容,然后重新启动 Xcode。 2. 调整编译设置:在 Xcode 的菜单栏中选择 "File" -> "Workspace Settings",然后点击 "Build System" 标签页,尝试切换到 "Legacy Build System",或者如果你已经在使用 "Legacy Build System",尝试切换到 "New Build System"。 3. 减少依赖库和框架:如果你的项目中有过多的依赖库和框架,可以考虑移除一些不必要的依赖,或者尝试使用静态库替代动态库。 4. 使用编译缓存:在 Xcode 的菜单栏中选择 "File" -> "Workspace Settings",然后点击 "Build System" 标签页,确保 "Use Shared Build Cache" 处于选中状态。这将利用其他项目构建过程中生成的缓存来加速编译。 5. 升级硬件配置:如果你的电脑性能较低,可以考虑升级硬件或使用更高配置的电脑来提升 Xcode编译速度。 6. 更新 Xcode:如果你的 Xcode 版本较旧,尝试升级到最新版本,以获取更好的性能和稳定性。 如果以上方法仍然无法解决问题,你可以尝试在开发者论坛或社区中寻求帮助,以获取更具体的解决方案。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值