在蘋果opensource上提供了所有objc
版本的源碼厨幻,但是建議使用該地址release版本進入搜索objc
即可下載正式版本.
先提供一份我已經(jīng)編譯好的可執(zhí)行源碼github,用著好給兄弟來個贊哈唇礁!
Objc源碼編譯
如果想做一個有追求的程序員虹钮,那就需要自己來編譯一份可執(zhí)行源碼魄藕,等以后Apple更新了源碼庫也可以不求人簸淀,自己擼了目胡。
依賴準備
依賴資源下載:
源碼下載:objc-781
其他依賴庫:OpenSource
Libc-825.40
除了Libc-825.40
都可以從第一個鏈接下載.因為objc4-781
也是在這個macOS 10.15.1版本放出的脓规。當然應該也可以使用更高版本的相關庫晓猛,但我這面防止有兼容問題就沒有使用了饿幅,有興趣的可以試一下。
初次編譯
打開objc源碼進行第一次編譯戒职,會發(fā)現(xiàn)編譯報錯:
很明顯是缺少文件栗恩,這時候就需要用到之前下載的依賴庫了。
第一步
這里推薦一個mac搜索軟件:Alfred很好用洪燥。
通過這個軟件直接找到對應文件磕秤。
根據(jù)上圖中的順序創(chuàng)建文件:sys
這個文件夾名不得隨意更改,需要跟報錯處保持一致,最后把文件拷入捧韵。
并且把它添加到項目的Header Search Paths
中市咆,依次選擇objc->TARGETS->objc->Build Settings
,搜索框中輸入header search path
再来,然后加入$(SRCROOT)/HRCommon
第二步
繼續(xù)編譯依舊會報錯,下方錯誤處理方式與第一步相同,不在贅述蒙兰,但是需要注意的是文件的拷貝路徑需要和報錯文件的路徑一致:
-
提示
mach-o/dyld_priv.h
file not found
選擇./dyld-733.6/include/mach-o/dyld_priv.h
- 拷貝后,還需要修改
dyld_priv.h
文件芒篷,即在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
-
提示
mach-o/dyld_priv.h
file not found
選擇./dyld-733.6/include/mach-o/dyld_priv.h
- 該文件中的
bridgeos(3.0)
會報錯,直接刪除即可
- 該文件中的
提示
pthread/tsd_private.h
file not found
選擇./libpthread-416.40.3/private/tsd_private.h
提示
pthread/spinlock_private.h
file not found
選擇./libpthread-416.40.3/private/spinlock_private.h
提示
os/lock_private.h
file not found
選擇./libplatform-200/private/os/lock_private.h
提示
System/machine/cpu_capabilities.h
file not found
選擇./xnu-6153.41.3/osfmk/machine/cpu_capabilities.h
提示
os/tsd.h
file not found
選擇./xnu-6153.41.3/libsyscall/os/tsd.h
-
提示
System/pthread_machdep.h
file not found
選擇./Libc-825.40.1/pthreads/pthread_machdep.h
- 該文件中會有報錯
_pthread_getspecific_direct
,_pthread_setspecific_direct
這兩個方法會報錯搜变,應該是出現(xiàn)了重復定義,這這兩個方法注釋
就可以了
- 該文件中會有報錯
-
提示
CrashReporterClient.h
file not found
選擇./Libc-825.40.1/include/CrashReporterClient.h
- 導入后還是報錯针炉,需要通過以下方式解決:- 需要在
Build Settings -> Preprocessor Macros
中加入LIBC_NO_LIBCRASHREPORTERCLIENT
- 導入后還是報錯针炉,需要通過以下方式解決:- 需要在
-
提示
objc-shared-cache.h
file not found
選擇./dyld-733.6/include/objc-shared-cache.h
- 注釋掉objc-runtime.mm中的#error mismatch in debug-ness macros
提示
_simple.h
file not found
選擇./libplatform-220/private/_simple.h
提示
kern/restartable.h
file not found
選擇./xnu-6153.41.3/osfmk/kern/restartable.h
提示
Block_private.h
file not found
選擇./libclosure-74/Block_private.h
至此文件缺少問題都已經(jīng)解決了挠他。
最終文件結構
第三步 libobjc.order 路徑問題
Can't open order file: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk/AppleInternal/OrderFiles/libobjc.order
- 選擇
target -> objc -> Build Settings
- 在工程的
Order File
中添加搜索路徑$(SRCROOT)/libobjc.order
第四步 lCrashReporterClient 編譯不到
Library not found for -lCrashReporterClient
- 選擇
target -> objc -> Build Settings
- 在
Other Linker Flags
中刪除-lCrashReporterClient
( Debug 和 Release 都刪了)
第五步 Xcode 腳本編譯問題
/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
- 選擇
target -> objc -> Build Phases -> Run Script(markgc)
- 把腳本文本
macosx.internal
改成macosx
猜測macosx.internal是蘋果內(nèi)部開發(fā)者的系統(tǒng)描述名稱。
大功告成
到了這一步篡帕,大膽的command + b
吧<ㄉ纭!赂苗!
objc 編譯調(diào)試
-
新建一個 Target : HRTest
-
綁定二進制依賴關系
完成
現(xiàn)在就可以進入main.m
開始調(diào)試之路了愉耙。
參考資料
最新Runtime源碼objc4-750編譯
最新macOS 10.15下objc4-779.1源碼編譯調(diào)試
2021.6.7 補充 objc4-818 源碼編譯
最近想要玩一下最新的818源碼,又需要重新進行編譯了拌滋。無意中發(fā)現(xiàn)這篇寫的挺不錯朴沿,偷個懶就直接拿過來了。
objc4-818 源碼編譯