目前objc4最新的源碼是750.1版本芽唇,看網(wǎng)上也沒人寫了這個版本的編譯方法脱柱,所以這里記錄一下。編譯方法都大同小異酸舍,只是有些部分新版做了改動帅韧。
先去下載源碼,地址 https://opensource.apple.com/tarballs/objc4/objc4-750.1.tar.gz
但是為了編譯這個源碼啃勉,我們還得下載其他的源碼忽舟,因?yàn)閛bjc4這個少了很多頭文件。
- dyld-551.3.tar.gz (新版的__API_AVAILABLE這個宏會報錯)
- xnu-4903.221.2.tar.gz
- libdispatch-1008.220.2.tar.gz
- libplatform-177.200.16.tar.gz
- libpthread-330.220.2.tar.gz
下好了之后淮阐,把上面這些依賴庫都解壓好后叮阅,扔進(jìn)同一個文件夾,方便查找頭文件泣特。
然后打開解壓后的objc工程浩姥。先build一下,就會報錯状您,說32位架構(gòu)已經(jīng)過期勒叠,請移除,這里我們要修改兩個target的配置膏孟,如下圖眯分,在工程的uild Settings里面,你可以在Architectures里面選擇使用64位柒桑,或者在下面的Valid Architectures里面將i386移除弊决。注意有兩個target(objc 和 objc-trampolines)都需要這么做。然后再編譯就會報其他錯誤了魁淳。
先是頭文件 #include <sys/reason.h>
找不到飘诗。這個時候就需要去我們下載的依賴庫里面去找頭文件了与倡。
首先在objc的工程目錄里面新建一個Common文件夾,用來存放我們拷貝的頭文件昆稿。然后到工程的uild Settings-->Header Search Path里面添加上我們剛剛創(chuàng)建的文件夾$(SRCROOT)/Common
然后在我們解壓的依賴庫的文件夾里面搜索
reason.h
纺座,會找到一個文件,然后按照 #include <sys/reason.h>
引用路徑貌嫡,在Common
文件夾里面新建一個sys
文件夾比驻,然后把reason.h文件拷貝到sys
里面该溯。然后編譯岛抄,這樣就會報另外的錯誤了。依舊是頭文件找不到的問題狈茉,然后按照剛剛的做法依次找到下面的頭文件夫椭,并且拷貝過去,注意引用時候的路徑是對應(yīng)不同的目錄的氯庆,需要按照要求新建文件夾
- 提示
mach-o/dyld_priv.h
file not found 選擇./dyld-551.3/include/mach-o/dyld_priv.h - 提示
os/lock_private.h
file not found選擇./libplatform-177.200.16/private/os/lock_private.h - 提示
os/base_private.h
file not found選擇./libplatform-177.200.16/private/os/base_private.h - 提示
pthread/tsd_private.h
file not found選擇./libpthread-330.220.2/private/tsd_private.h - 提示
System/machine/cpu_capabilities.h
file not found選擇./xnu-4903.221.2/osfmk/machine/cpu_capabilities.h - 提示
os/tsd.h
file not found選擇./xnu-4903.221.2/libsyscall/os/tsd.h - 提示
pthread/spinlock_private.h
file not found選擇./libpthread-330.220.2/private/spinlock_private.h - 提示
System/pthread_machdep.h
file not found 這個特殊處理一下蹭秋,直接把該處的頭文件引用注釋掉。 - 提示
CrashReporterClient.h
file not found 這個也要特殊處理堤撵。因?yàn)樾掳娴腖IBC庫已經(jīng)把這個頭文件移除掉了仁讨。我們先把引用的到這個頭文件地方注釋掉。然后在objc-errors.mm
搜索CRSetCrashLogMessage
实昨,把調(diào)用的地方都改為0洞豁,接著搜索CRSetCrashLogMessage
,把調(diào)用的地方注釋掉荒给。 - 提示
Block_private.h
file not found
選擇./libdispatch-1008.220.2/src/BlocksRuntime/Block_private.h - 提示
objc-shared-cache.h
file not found
選擇./dyld-551.3/include/objc-shared-cache.h - 提示
Use of undeclared identifier 'DYLD_MACOSX_VERSION_10_13'
丈挟,這個需要打開剛剛拷貝過去的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
- 提示
isa.h
file not found志电,這個去objc4的工程的runtime文件夾里面找到isa.h
,然后把它拖入工程曙咽。 - 提示
_simple.h
file not found 選擇./libplatform-177.200.16/private/_simple.h
頭文件就這么多了。剩下的是配置問題
- 提示
ld: can't open order file: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/AppleInternal/OrderFiles/libobjc.order
挑辆,這個修改工程配置例朱,將Build Settings->Linking->Order File改為 $(SRCROOT)/libobjc.order。 - 提示
ld: library not found for -lCrashReporterClient clang: error: linker command failed with exit code 1 (use -v to see invocation)
在 Build Settings -> Linking -> Other Linker Flags里刪掉"-lCrashReporterClient"(Debug和Release都刪了) - 提示
/xcodebuild:-1: SDK "macosx.internal" cannot be located.
把objc的Build Phases-->Run Script(markgc)里的內(nèi)容macosx.internal改為macosx
- 提示
no such public header file: '/tmp/objc.dst/usr/include/objc/ObjectiveC.apinotes'
把Target objc的Build Settings->Other Text-Based InstallAPI Flags里的內(nèi)容全部清除鱼蝉。
并且把Text-Based InstallAPI Verification Model
里的值改為Errors Only
至此洒嗤,編譯應(yīng)該是可以了,接下來刪除掉一個警告 - 警告
Traditional headermap style is no longer supported; please migrate to using separate headermaps and set 'ALWAYS_SEARCH_USER_PATHS' to NO. (in target 'objc-trampolines')和Traditional headermap style is no longer supported; please migrate to using separate headermaps and set 'ALWAYS_SEARCH_USER_PATHS' to NO. (in target 'objc’)
在項(xiàng)目Target->objc-trampolines
和objc
中的Build Settings下設(shè)置ALWAYS_SEARCH_USER_PATHS
為No蚀乔。
至此烁竭,已經(jīng)可以編譯通過了。然后你可以在這個工程再新建一個Target來進(jìn)行調(diào)試吉挣。