美文网首页
iOS-objc4-781源码编译配置流程

iOS-objc4-781源码编译配置流程

作者: JimmyCJJ | 来源:发表于2020-10-31 15:40 被阅读0次

    前言

    本文详细地讲述编译苹果源码objc4-781 的过程,过程中会有很多的报错问题,由于每个版本的报错问题可能不一致,所以仅仅针对objc4-781 版本。
    文末附有下载链接,如果想要配置好的工程,直接下载即可。

    当前环境 xcode 12.0 ;macos 10.15 ; objc4-781
    注意:该源码仅支持在xcode 12.0以下(包括12.0)编译

    去苹果开源网站找到缺失的文件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


    参考文章
    揭秘NSRuntime源码编译
    iOS-底层原理 03:objc4-781 源码编译 & 调试

    相关文章

      网友评论

          本文标题:iOS-objc4-781源码编译配置流程

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