前言
本文详细地讲述编译苹果源码objc4-781
的过程,过程中会有很多的报错问题,由于每个版本的报错问题可能不一致,所以仅仅针对objc4-781
版本。
文末附有下载链接,如果想要配置好的工程,直接下载即可。
当前环境 xcode 12.0 ;macos 10.15 ; objc4-781
注意:该源码仅支持在xcode 12.0以下(包括12.0)编译
- 源码地址:https://opensource.apple.com/tarballs/objc4/
- 这里我所下载的版本是781,是当前的最新版本,以下是下载链接,需要在尾缀加上
.tar.gz
才能进行下载
https://opensource.apple.com/tarballs/objc4/objc4-781.tar.gz - 打开objc源码后运行,会报错
Showing Recent Messages unable to find sdk 'macosx.internal'
解决方法:Build Settings
->搜Base SDK
->改为mac OS 10.15
注意:Targets
和Project
都要改
-
运行,继续报错
去苹果开源网站找到缺失的文件reason.h
,选择对应版本,然后按照这样的下载格式下载
路径:https://opensource.apple.com/source/xnu/
下载格式:https://opensource.apple.com/tarballs/xnu/xnu-6153.81.5.tar.gz
然后在根目录下创建一个文件夹,例如我这里创建一个文件夹
LostFile
,然后再嵌套一个子文件夹sys
,把reason.h
文件拷贝到sys
里面,然后还要链接文件的搜索路径:Build Setting
->Header Search Paths
->添加$(SRCROOT)/LostFile
- 运行,继续报错
也是跟上面一样的报错,缺失文件,接下来还有一堆同样的缺失文件报错,所以我直接在这里放出所有缺失文件的下载地址供大家下载
缺失文件目录整理如下
文件寻找路径如下
基路径:https://opensource.apple.com/tarballs/
Block_private.h // libclosure-76/Block_private.h
_simple.h // libplatform-220/private/_simple.h
restartable.h // xnu-6153.81.5/osfmk/kern/restartable.h
CrashReporterClient.h // Libc/Libc-825.40.1/include/CrashReporterClient.h
objc-shared-cache.h // dyld-750.6/include/objc-shared-cache.h
pthread_machdep.h // Libc/Libc-825.40.1/pthreads/pthread_machdep.h
cpu_capabilities.h // xnu-6153.81.5/osfmk/machine/cpu_capabilities.h
tsd_private.h // libpthread-416.40.3/private/tsd_private.h
spinlock_private.h // libpthread-416.40.3/private/spinlock_private.h
tsd.h // xnu-6153.81.5/libsyscall/os/tsd.h
lock_private.h // libplatform-220/private/os/lock_private.h
base_private.h // libplatform-220/private/os/base_private.h
dyld_priv.h // dyld-750.6/include/mach-o/dyld_priv.h
reason.h // xnu-6153.81.5/bsd/sys/reason.h
整个配置好的源码我已放上github,下载链接放在文末,其中缺失文件在
https://github.com/JimmyCJJ/objc4-781/tree/main/objc4-781/LostFile
-
mach-o/dyld-priv.h
这个文件运行报错Expected ','
,直接把报错的代码注释掉即可
-
lock_private
编译报错Expected ','
,解决方法:删掉报错的bridgeos(4.0)
-
pthread_machdep
运行报错,一样注释掉(注意,一定要注释掉__inline__ static int
,不然另外的文件会报错) -
objc-os
编译报错 注释掉 -
objc-errors
编译报错
解决方法:target
->Build Settings
->Preprocessor Macros Not Used In Precompiled He...
添加LIBC_NO_LIBCRASHREPORTERCLIENT
- 编译报错
can't open order file: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/AppleInternal/OrderFiles/libobjc.order
解决方法:target
->Build Settings
->Order File
更改为$(SRCROOT)/libobjc.order
- 编译报错:
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
- 编译报错:
library not found for -lCrashReporterClient
解决方法:target
->BuildSettings
->Other Linker Flags
->Debug
->删除lCrashReporterClient
-
编译报错
解决方法:选择 target
->Build Phases
-> Run Script(markgc)
把脚本文本 macosx.internal
改成 macosx
- 编译通过
正式调试源码
- 新增一个
target
项目
Targets
->"+"
->macOS
->Application
->Command Line Tool
->Next
-
绑定二进制依赖关系
- 前往刚刚创建的
Target
文件夹,创建一个Person
类用于调试
- 可能会遇到
main.m
文件中断点无效的问题,这时候需要到Targets
->Build Phases
->Compile Sources
中把main.m
移到第一位即可
配置好的源码下载链接
https://github.com/JimmyCJJ/objc4-781
网友评论