Runtime(1)--源碼編譯

Runtime,是一套底層的 C 語言 API罪塔,是 iOS 系統(tǒng)的核心之一投蝉。開發(fā)者在編碼過程中,可以給任意一個對象發(fā)送消息征堪,在編譯階段只是確定了要向接收者發(fā)送這條消息瘩缆,而接受者將要如何響應(yīng)和處理這條消息,那就要看運行時來決定了佃蚜。

C語言中庸娱,在編譯期着绊,函數(shù)的調(diào)用就會決定調(diào)用哪個函數(shù)。
而OC的函數(shù)熟尉,屬于動態(tài)調(diào)用過程归露,在編譯期并不能決定真正調(diào)用哪個函數(shù),只有在真正運行時才會根據(jù)函數(shù)的名稱找到對應(yīng)的函數(shù)來調(diào)用斤儿。
Objective-C 是一個動態(tài)語言靶擦,這意味著它不僅需要一個編譯器,也需要一個運行時系統(tǒng)來動態(tài)得創(chuàng)建類和對象雇毫、進行消息傳遞和轉(zhuǎn)發(fā)玄捕。

調(diào)試環(huán)境

  1. Xcode版本: 10.1
  2. Runtime源碼版本: objc4-750.1

代碼地址

版本750.1官方源碼地址: objc4-750.1.tar.gz
官方歷史源碼地址列表: runtime歷史源碼版本列表

讓Runtime源碼可以編輯步驟還是比較多這里放置一份我已經(jīng)編譯通過的代碼 點這里

開始編譯源代碼

下載完代碼的目錄如圖



最終結(jié)果就是編譯Products目錄下的libobjc.A.dylib。開始編譯按照提示依次解決直到成功編譯棚放。

1. i386架構(gòu)廢棄
  • 錯誤提示信息
The i386 architecture is deprecated. You should update your ARCHS build setting to remove the i386 architecture. (in target 'objc-trampolines')
 The i386 architecture is deprecated. You should update your ARCHS build setting to remove the i386 architecture. (in target 'objc')

提示的是在target 'objc-trampolines' 和 'objc'中i386已經(jīng)廢棄了枚粘。

  • 解決方案
    分別從tatget中移除i386架構(gòu),進入TARGETS->objc->Build Settings->Architectures 將"Debug"修改成Standard Architectures
演示.gif
2. 缺少文件

缺少的文件點擊 這里下載飘蚯。

  • 錯誤提示信息
    會出現(xiàn)以下缺失文件的提示下面羅列出來
'sys/reason.h' file not found
'mach-o/dyld_priv.h' file not found
'os/lock_private.h' file not found
'os/base_private.h' file not found
'pthread/tsd_private.h' file not found
'System/machine/cpu_capabilities.h' file not found
'os/tsd.h' file not found
'pthread/spinlock_private.h' file not found
'System/pthread_machdep.h' file not found
'Block_private.h' file not found
'objc-shared-cache.h' file not found
'_simple.h' file not found
  • 解決方案
    在工程目錄下創(chuàng)建一個新的文件夾名字可以隨便起我命名為Common將剛才下載的文件都放在里面馍迄,

    接下來把文件添加到Header Search Paths中,進入TARGETS->objc->Build Settings 直接搜索Header Search Paths局骤,把$(SRCROOT)/Common添加進去攀圈。

    下面根據(jù)信息的提示在Common目錄下新建文件夾sys,將剛才下載的reason.h文件拖動到sys文件夾里這樣我們就解決了sys/reason.h' file not found這個錯誤峦甩,其他的提示都是類似解決方法赘来。
    Common內(nèi)部結(jié)構(gòu)
3. pthread_machdep.h文件的錯誤
  • 提示信息
Static declaration of '_pthread_has_direct_tsd' follows non-static declaration
Static declaration of '_pthread_getspecific_direct' follows non-static declaration
Typedef redefinition with different types ('int' vs 'volatile OSSpinLock' (aka 'volatile int'))
  • 解決方案
    注釋掉pthread_machdep.h中錯誤提示代碼,從提示的位置注釋到最后凯傲。


4. objc-runtime-new.mm文件的錯誤
  • 錯誤提示信息
Use of undeclared identifier 'DYLD_MACOSX_VERSION_10_11'
Use of undeclared identifier 'DYLD_MACOSX_VERSION_10_14'
  • 解決方案
    在我們剛剛添加的Common文件夾中的dyld_priv.h頭部添加相關(guān)的宏定義犬辰。
#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
5. 缺少CrashReporterClient.h

CrashReporterClient.h文件僅僅放在Common目錄下還不行還要做一些其他處理。

  • 錯誤提示信息
Use of undeclared identifier 'CRGetCrashLogMessage'
Use of undeclared identifier 'CRSetCrashLogMessage'
  • 解決方案
    進入TARGETS->objc->Build Settings 直接搜索preprocessor冰单,在Preprocessor Macros中添加 LIBC_NO_LIBCRASHREPORTERCLIENT幌缝。
6. can't open order file
  • 錯誤提示信息
ld: can't open order file: /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/AppleInternal/OrderFiles/libobjc.order
clang: error: linker command failed with exit code 1 (use -v to see invocation)
  • 解決方案
    進入TARGETS->objc->Build Settings->Linking->Order File 修改為$(SRCROOT)/libobjc.order。
7. not found for -lCrashReporterClient
  • 錯誤提示信息
ld: library not found for -lCrashReporterClient
clang: error: linker command failed with exit code 1 (use -v to see invocation)
  • 解決方案
    進入TARGETS->objc->Build Settings->Linking->Other Linker Flags中刪除lCrashReporterClient诫欠,DEBUG和RELEASE都刪除涵卵。
8. macosx.internal不能被定位到
  • 錯誤提示信息
SDK "macosx.internal" cannot be located.
unable to find utility "clang++", not a developer tool or in PATH
  • 解決方案
    進入TARGETS->objc->Build Phases->Run Script,將腳本里面的macosx.internal->macosx荒叼。
9. public header
  • 錯誤提示信息
no such public header file: '/tmp/objc.dst/usr/include/objc/ObjectiveC.apinotes'
  • 解決方案

第一步: 進入TARGETS->objc->Build Settinngs->Text-Based API->Other Text-Based InstallAPI Flags轿偎,將里面的內(nèi)容設(shè)置為空。

第二步: 將Text-Based InstallAPI Verification Mode改為Errors Only甩挫,如圖


編譯成功

到此為止這份源代碼就可以通過編譯了贴硫,現(xiàn)在看一下工程目錄,可以看到Products下面的庫變成了黑色伊者。


添加新的TARGETS進行調(diào)試

PS: 后續(xù)會有一系列關(guān)于runtime的總結(jié)英遭,如有理解不妥,歡迎交流

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末亦渗,一起剝皮案震驚了整個濱河市挖诸,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌法精,老刑警劉巖多律,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異搂蜓,居然都是意外死亡狼荞,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進店門帮碰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來相味,“玉大人,你說我怎么就攤上這事殉挽》嵘妫” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵斯碌,是天一觀的道長一死。 經(jīng)常有香客問我,道長傻唾,這世上最難降的妖魔是什么投慈? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮冠骄,結(jié)果婚禮上逛裤,老公的妹妹穿的比我還像新娘。我一直安慰自己猴抹,他們只是感情好带族,可當(dāng)我...
    茶點故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蟀给,像睡著了一般蝙砌。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上跋理,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天择克,我揣著相機與錄音,去河邊找鬼前普。 笑死肚邢,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播骡湖,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼贱纠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了响蕴?” 一聲冷哼從身側(cè)響起谆焊,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎浦夷,沒想到半個月后辖试,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡劈狐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年罐孝,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肥缔。...
    茶點故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡莲兢,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出辫继,到底是詐尸還是另有隱情怒见,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布姑宽,位于F島的核電站遣耍,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏炮车。R本人自食惡果不足惜舵变,卻給世界環(huán)境...
    茶點故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望瘦穆。 院中可真熱鬧纪隙,春花似錦、人聲如沸扛或。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽熙兔。三九已至悲伶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間住涉,已是汗流浹背麸锉。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留舆声,地道東北人花沉。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親碱屁。 傳聞我的和親對象是個殘疾皇子磷脯,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,486評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 最新版本的Runtime源碼已經(jīng)出來了,是不急不可耐的想用用它呢忽媒?在這里我將一步步教大家如何編譯它争拐,首先貼個自己的...
    逆風(fēng)g閱讀 2,425評論 1 10
  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom閱讀 2,694評論 0 3
  • runtime 常見作用 該文件的目的是為讀者誰可能有興趣學(xué)習(xí)的Objective-C的運行時腋粥。因為這不是一個關(guān)于...
    陽明先生_X自主閱讀 883評論 1 13
  • 轉(zhuǎn)自:http://www.th7.cn/Program/IOS/201506/484001.shtml 首先是怎...
    Aiya閱讀 14,787評論 2 8
  • 娛樂只是一時的痛快晦雨,科學(xué)才是終生的追求。
    jilyyang閱讀 129評論 0 0