编译 objc4-866.9 源码

编译环境

  • macOS Ventura 13.3
  • Xcode 14.3
  • Apple M2 Pro

如果环境大体相同可用我已整理好的工程:objc4-866.9 源码编译

源码下载

建议到 Apple Open Source 下载对应版本的包,此处指列出本机环境所需要的包

  • objc4-866.9
  • dyld-1042.1
  • Libc-1534.81.1
  • Libc-825.40.1
  • libclosure-84
  • libdispatch-1412
  • libplatform-288
  • libpthread-514
  • xnu-8792.81.2

工程修改

我们在 objc4 工程目录下新建一个 include 文件夹,用来存放修复编译问题的头文件。

修改脚本

修改 objc targetRun Script (markgc) 脚本,将 macosx.internal 改成 macosx

修改Base SDK

Project -> build setting -> Base SDK,选择 macOS

修改编译目标

设置 Header Search Paths

将我们刚才创建的 include 文件夹路径添加到 Header Search Paths

编译 objc 并修复错误

有关错误修复可查看这两篇文章,需要修复的错误有点多,这里不再罗列,只添加这两篇文章中没有的问题修复。

  • iOS objc4-838编译流程,可在macOS Monterey运行
  • objc4-841.13可调试/编译源码更新(for M1)

‘sandbox/private.h’ file not found

错误如图,直接注释掉 #include <sandbox/private.h> 即可。

Use of undeclared identifier ‘SANDBOX_FILTER_PATH’

注释掉 #include <sandbox/private.h> 再编译会遇到如下错误:

解决方式同样是直接注释掉相关代码,如下图:

或者注释掉这个方法体也可。

创建调试 target

进行完上面的错误修复后,我们就可以创建一个用于调试的 target。如下图,我们创建一个 macOS 的命令行 target

添加依赖和动态库

修复断点不走问题

设置 Enable Hardened Runtime 为 NO

Build PhasesCompile Sources 中,将 main.m 拖到最前面

参考文档:

  • Open Source at Apple

  • iOS objc4-838编译流程,可在macOS Monterey运行

  • objc4-841.13可调试/编译源码更新(for M1)