美文网首页
一 OC底层 源码编译调试

一 OC底层 源码编译调试

作者: 可乐冒气 | 来源:发表于2020-11-23 22:36 被阅读0次

    最新 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.2libpthread-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底层 源码编译调试

          本文链接:https://www.haomeiwen.com/subject/nrbviktx.html