最新 macOS 10.15.6 下 objc4-787.1 源码编译调试
当前环境 macOS 10.15.7 xcode 11.5
objc4-787.1 下载地址
下载相关文件
需要下载相关文件:
objc4-787.1、
Libc-1353.100.2 、
dyld-750.6、
libauto-187、
libdispatch-1173.100.2 、libpthread-416.100.3、
libclosure-74 、
xnu-6153.141.1、
libplatform-220.100.1
- 解压
objc4-787.1
运行xcodeproj
文件,选择target
,objc
运行
以下开始解决错误
- 两个
unable to find sdk 'macosx.internal'
错误
解决方案:- 选择
targets -> objc-> build settings -> Base SDK
选择 macOS - 选择
targets -> objc-trampolines -> build settings -> Base SDK
选择 macOS
- 选择
2 sys/reason.h' file not found
, 文件找不到
解决方案:
- 这是我们在项目根目录下创建 Common 文件夹,Common 文件夹就是我们放依赖文件的地方
- 该文件在我们之前下载的 xnu-6153.141.1 库中, 目录
xnu-6153.141.1/bsd/sys/reason.h
, 将文件放入 Common/sys 目录下
- 现在还不行 需要给 Common 文件夹 添加文件索引
targets -> objc -> Build Settings -> Header Search Paths
添加引用 如下:$(SRCROOT)/Common/
接下来 还有很多的文件丢失 ,我们同上处理
1、 'sys/reason.h' file not found --> xnu-6153.141.1/bsd/sys/reason.h
2、 'mach-o/dyld_priv.h' file not found --> dyld-750.6/include/mach-o/dyld-priv.h
3、'os/lock_private.h' file not found --> libplatform-220.100.1/private/os/lock_private.h
4、'os/base_private.h' file not found --> libplatform-220.100.1/private/os/base_private.h
5、'pthread/tsd_private.h' file not found --> libpthread-416.100.3/private/tsd_private.h
6、'System/machine/cpu_capabilities.h' file not found ---> xnu-6153.141.1/osfmk/machine/cpu_capabilities.h
7、'os/tsd.h' file not found ---> xnu-6153.141.1/libsyscall/os/tsd.h
8、 'pthread/spinlock_private.h' file not found ---> libpthread-416.100.3/private/spinlock_private.h
9、 'objc-shared-cache.h' file not found ---> dyld-750.6/include/objc-shared-cache.h
10、'_simple.h' file not found ---> libplatform-220.100.1/private/_simple.h
11、'Block_private.h' file not found ---> libclosure-74/Block_private.h
' 12、'kern/restartable.h' file not found ----> xnu-6153.141.1/osfmk/kern/restartable.h
个别难找的文件丢失
1、'System/pthread_machdep.h' file not found
---> 该文件不在我们下载的库中,处于之前libc版本中 下载地址:https://opensource.apple.com/source/Libc/Libc-825.24/pthreads/pthread_machdep.h
2、'CrashReporterClient.h' file not found
---> 同上https://opensource.apple.com/source/Libc/Libc-825.26/include/CrashReporterClient.h
文件目录最终如下
还有问题
错误一
- 出现8个
Expected ','
错误,dyld_priv.h
7个 、lock_private .h
1 个
解决 :-
dyld_priv.h
将报错行 注释就行了 -
lock_private.h
删除bridgeos(4.0)
-
错误二 :
pthread_machdep.h
编译错误
-
pthread_machdep.h
是我们后续加入的,里面有一些定义和原Runtime源码定义重复了,需要将pthread_machdep.h
中的重复定义注释。 - 分别将
pthread_machdep.h
文件中的_pthread_has_direct_tsd
、_pthread_setspecific_direct
、_pthread_getspecific_direct
注释即可。
错误三 :
Use of undeclared identifier 'DYLD_MACOSX_VERSION_10_11'
和Use of undeclared identifier 'DYLD_MACOSX_VERSION_10_14'
处理方法:我们在Common/mach-o/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
错误四 :
Use of undeclared identifier 'CRGetCrashLogMessage'
解决方法:targets -> objc -> Build Settings -> Preprocessor Macros Not Used In
添加 LIBC_NO_LIBCRASHREPORTERCLIENT
错误五 :
ld: can't open order file: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/AppleInternal/OrderFiles/libobjc.order clang: error: linker command failed with exit code 1 (use -v to see invocation)
解决方法: Build Settings->Linking->Order File -> Debug
改成$(SRCROOT)/libobjc.order
错误六 :
ld: library not found for -lCrashReporterClient clang: error: linker command failed with exit code 1 (use -v to see invocation)
解决方法:
虽然我们添加了 CrashReporterClient
但还是在报错,所以直接删除引用。
在 TARGETS -> objc -> Build Settings -> Linking -> Other Linker Flags
里删掉 Debug -> Any macOS SDK
和 Release -> Any macOS SDK
中的"-lCrashReporterClient"
删除之后如下
错误七 :
/xcodebuild:1:1: SDK "macosx.internal" cannot be located.
/xcrun:1:1: sh -c '/Applications/Xcode.app/Contents/Developer/usr/bin/xcodebuild -sdk macosx.internal -find clang++ 2> /dev/null' failed with exit code 16384: (null) (errno=No such file or directory)
/xcrun:1:1: unable to find utility "clang++", not a developer tool or in PATH
解决方法:将 Targets -> objc ->Build Phases->Run-Script(markgc)
里的内容macosx.internal
改为macosx
------ 终于编译通过
现在 我们搭建一个 target
, 就命名 objc_run
绑定二进制依赖关系
现在可以开始在 objc_run/main.m
中 愉快的玩耍了