objc4-750源碼編譯

OC的一個主要特性Runtime運行時特性馍盟,在日常開發(fā)中我們使用到的都是不可見的,還好官方提供了Runtimeobjc4)源碼供開發(fā)者研究茧吊,我是小白贞岭,下面就開始邁出源碼探索的第一步八毯,源碼編譯。

源碼地址

一瞄桨、下載objc4-750话速,編譯解決報錯問題

1、進入源碼區(qū)芯侥,搜索objc4并下載

objc4.png

同時下載objc4相關(guān)依賴dyld泊交、launchd、Libc柱查、libauto廓俭、libclosure、libdispatch唉工、libplatform研乒、libpthread、xnu淋硝。放在方便操作的文件夾雹熬,方便搜索查找。

dependent.png

2谣膳、下載后解壓竿报,并打開工程,如下圖:

project.png

3继谚、運行工程編譯報錯如下:

error.png

報錯信息:
error: The i386 architecture is deprecated. You should update your ARCHS build setting to remove the i386 architecture. (in target 'objc')
error: The i386 architecture is deprecated. You should update your ARCHS build setting to remove the i386 architecture. (in target 'objc-trampolines')

解決方法:target-Build Settings -Architecture設(shè)置為Standard arcgutectures

architectures.png

4仰楚、解決問題后編譯,繼續(xù)報錯:

reasonerror.png

一看發(fā)現(xiàn)reason.h頭文件沒找到犬庇,缺失依賴文件,在步驟1下載的文件中搜索sys/reason.h文件侨嘀,加入即可臭挽。我們需要創(chuàng)建一個include文件來存放這些缺失的依賴文件。
設(shè)置頭文件路徑:

header.png

搜索缺失文件:

find.png

添加頭文件后繼續(xù)編譯咬腕,繼續(xù)添加缺失文件……

5欢峰、添加的過程中發(fā)現(xiàn)pthread_machdep.h在依賴中沒有,CrashReporterClient.h也沒有找到涨共,也不知道在哪個庫纽帖,一臉懵逼,直接谷歌找到連接:
https://opensource.apple.com/source/Libc/Libc-825.24/pthreads/pthread_machdep.h
https://opensource.apple.com/source/Libc/Libc-825.26/include/CrashReporterClient.h
打開連接復(fù)制源碼到新建文件举反,解決懊直,哭笑不得。最新的源碼居然缺少文件火鼻,還要在歷史版本庫找室囊。
編譯后pthread_machdep.h文件報錯:
Typedef redefinition with different types ('int' vs 'volatile OSSpinLock' (aka 'volatile int’))
重復(fù)定義雕崩,注釋即可。
編譯繼續(xù)報錯:
Static declaration of '_pthread_getspecific_direct' follows non-static declaration
注釋掉pthread_machdep.h中所有的錯誤信息融撞。

6盼铁、編譯報錯:
Expected ','

extern bool dyld_program_minos_at_least(dyld_build_version_t version) __API_AVAILABLE(macos(10.14), ios(12.0), watchos(5.0), tvos(12.0), bridgeos(3.0));

直接注釋掉就行。繼續(xù)編譯尝偎,問題繼續(xù)出現(xiàn)報錯:
Use of undeclared identifier 'DYLD_MACOSX_VERSION_10_14'
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

問題解決饶火。

7、接著步驟6編譯出現(xiàn):
'isa.h' file not found
isa.h文件在工程runtime文件中復(fù)制粘貼到include文件下即可致扯。

isa.png

8肤寝、繼續(xù)編譯繼續(xù)報錯:'_simple.h' file not found 搜索文件添加。
9急前、編譯報錯:Use of undeclared identifier 'CRGetCrashLogMessage'醒陆。
解決方法:target -> Build Settings -> Preprocessor Macros 添加LIBC_NO_LIBCRASHREPORTERCLIENT

preprocessor.png

10、編譯報錯:
clang:-1: linker command failed with exit code 1 (use -v to see invocation)
no such file or directory: 'lCrashReporterClient'

解決方法:在 Build Settings -> Linking -> Other Linker Flags里刪掉"-lCrashReporterClient"DebugRelease都刪了)

ICrashReporter.png

11裆针、編譯報錯:
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)

解決方法: Build Settings->Linking->Order File 改成$(SRCROOT)/libobjc.order

libobjc.png

12刨摩、編譯報錯:
Showing All Messages
/xcodebuild:-1: SDK "macosx.internal" cannot be located.
/xcrun:-1: unable to find utility "clang++", not a developer tool or in PATH

解決方法:將Target->Build Phases->Run-Script(markgc)里的內(nèi)容macosx.internal改為macosx

macosx.png

13、編譯報錯:
error: no such public header file: '/tmp/objc.dst/usr/include/objc/ObjectiveC.apinotes'
解決方法:Target->Build Settings->Other Text-Based InstallAPI Flags里的內(nèi)容設(shè)為空世吨;
Text-Based InstallAPI Verification Model里的值改為Errors Only澡刹。

ObjectiveC.apinotes.png

14、編譯報錯耘婚,額…… 居然編譯通過了罢浇。

二、添加Debug Target

1沐祷、添加一個target取名為 objc-test

objctest.png

2嚷闭、引入頭文件#import <objc/message.h>創(chuàng)建一個新類HBObject,繼承自NSObject類赖临。添加屬性胞锰,方法,并給屬性賦值兢榨,調(diào)用方法嗅榕。運行如下:

objc_test.png

代碼:

#import <Foundation/Foundation.h>
#import <objc/message.h>

void hb_test_method(Class cla, SEL _cmd){
    NSLog(@"我這個添加的方法被調(diào)用了");
}
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Class HBObject = objc_allocateClassPair(objc_getClass("NSObject"), "HBObject", 0);
        class_addIvar(HBObject, "name", sizeof(id), log2(sizeof(id)), @encode(id));
        class_addMethod(HBObject, sel_registerName("hb_test_method"), (IMP)hb_test_method, "v@:");
        objc_registerClassPair(HBObject);
        id newObject = [[HBObject alloc]init];
        [newObject setValue:@"yahibo" forKey:@"name"];
        NSLog(@"name:%@",[newObject valueForKey:@"name"]);
        objc_msgSend(newObject,sel_registerName("hb_test_method"));
    }
    return 0;
}

至此完成了源碼調(diào)試,編譯通過吵聪。

注意如果報錯:Undefined symbol: _objc_opt_class凌那,需要適配Mac系統(tǒng),project -> deployment target Mac OS選擇10.14

調(diào)試成功的源碼地址

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吟逝,一起剝皮案震驚了整個濱河市帽蝶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌块攒,老刑警劉巖嘲碱,帶你破解...
    沈念sama閱讀 218,386評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件金砍,死亡現(xiàn)場離奇詭異,居然都是意外死亡麦锯,警方通過查閱死者的電腦和手機恕稠,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,142評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來扶欣,“玉大人鹅巍,你說我怎么就攤上這事×响簦” “怎么了骆捧?”我有些...
    開封第一講書人閱讀 164,704評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長髓绽。 經(jīng)常有香客問我敛苇,道長,這世上最難降的妖魔是什么顺呕? 我笑而不...
    開封第一講書人閱讀 58,702評論 1 294
  • 正文 為了忘掉前任枫攀,我火速辦了婚禮,結(jié)果婚禮上株茶,老公的妹妹穿的比我還像新娘来涨。我一直安慰自己,他們只是感情好启盛,可當(dāng)我...
    茶點故事閱讀 67,716評論 6 392
  • 文/花漫 我一把揭開白布蹦掐。 她就那樣靜靜地躺著,像睡著了一般僵闯。 火紅的嫁衣襯著肌膚如雪卧抗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,573評論 1 305
  • 那天鳖粟,我揣著相機與錄音社裆,去河邊找鬼。 笑死牺弹,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的时呀。 我是一名探鬼主播张漂,決...
    沈念sama閱讀 40,314評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼谨娜!你這毒婦竟也來了航攒?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,230評論 0 276
  • 序言:老撾萬榮一對情侶失蹤趴梢,失蹤者是張志新(化名)和其女友劉穎漠畜,沒想到半個月后币他,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,680評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡憔狞,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,873評論 3 336
  • 正文 我和宋清朗相戀三年蝴悉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瘾敢。...
    茶點故事閱讀 39,991評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡拍冠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出簇抵,到底是詐尸還是另有隱情庆杜,我是刑警寧澤,帶...
    沈念sama閱讀 35,706評論 5 346
  • 正文 年R本政府宣布碟摆,位于F島的核電站晃财,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏典蜕。R本人自食惡果不足惜断盛,卻給世界環(huán)境...
    茶點故事閱讀 41,329評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望嘉裤。 院中可真熱鬧郑临,春花似錦、人聲如沸屑宠。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,910評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽典奉。三九已至躺翻,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間卫玖,已是汗流浹背公你。 一陣腳步聲響...
    開封第一講書人閱讀 33,038評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留假瞬,地道東北人陕靠。 一個月前我還...
    沈念sama閱讀 48,158評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像脱茉,于是被迫代替她去往敵國和親剪芥。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,941評論 2 355