一 OC底层 源码编译调试

最新 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 文件,选择 targetobjc 运行
    以下开始解决错误
  1. 两个 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.h7个 、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 SDKRelease -> 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中 愉快的玩耍了

你可能感兴趣的:(一 OC底层 源码编译调试)