iOS-objc4-781源碼編譯配置流程

前言

本文詳細地講述編譯蘋果源碼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 源碼編譯 & 調試

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。