Other Linker Flags

Other Linker Flags到底是用來干嘛的?

  • 它是用來鏈接的, 一個(gè)程序從代碼可執(zhí)行文件往往要經(jīng)歷以下步驟:

源代碼 > 預(yù)處理器 > 編譯器 > 匯編器 > 機(jī)器碼 > 鏈接器 > 可執(zhí)行文件

為什么我們調(diào)用靜態(tài)庫的方法時(shí)候會閃退

  • selector not recognized
    • 簡單來說枝嘶,因?yàn)閁NIX 靜態(tài)庫(.a文件) 與 OC 的動態(tài)機(jī)制不協(xié)調(diào)導(dǎo)致, 因?yàn)镺bjective-C的鏈接器并不會為每個(gè)方法建立符號表,而是僅僅為建立了符號表督赤。這樣的話檀轨,如果靜態(tài)庫中定義了已存在的一個(gè)類的分類射众,鏈接器就會以為這個(gè)類已經(jīng)存在,不會把分類和核心類的代碼合起來吃粒。這樣的話闺金,在最后的可執(zhí)行文件中碉怔,就會缺少分類里的代碼烘贴,這樣函數(shù)調(diào)用就失敗了。

UNIX靜態(tài)庫及C程序鏈接過程:

當(dāng)一個(gè)C語言程序編譯時(shí)撮胧,所有源碼會編譯為對象文件桨踪,即.o文件(object file)。這些對象文件中包含了可執(zhí)行程序和靜態(tài)數(shù)據(jù)芹啥。鏈接器最終將所有文件組合到一起, 產(chǎn)生最終的可執(zhí)行文件锻离。
當(dāng)一個(gè)源文件引用了定義在其他文件中的一些東西時(shí)(一個(gè)方法)铺峭,一個(gè) undefined symbol 就寫入了它所產(chǎn)生的object 文件中,等待最終被解釋掉汽纠。在最終構(gòu)建可執(zhí)行文件的時(shí)卫键,鏈接器將包含這些undefined symbols的object文件中拉取信息, 解決掉被標(biāo)記的undefined symbols。
一個(gè)UNIX的靜態(tài)庫其實(shí)就是一系統(tǒng)object file的集合虱朵,一般情況下, 它只會拉取它需要的文件莉炉。好處是減小最終可執(zhí)行文件的大小。

舉個(gè)例子

比如main.c使用一個(gè)函數(shù)碴犬,名叫foo( )絮宁,而這個(gè)函數(shù)定義myMain.c里面。在生成.o文件的時(shí)候服协,main.o就會有一個(gè)foo( )undefined symbols標(biāo)記绍昂。鏈接期間,myMain.o便會被打入最終的可執(zhí)行文件中偿荷。但是窘游,假如還有一個(gè)heMain.c文件,但是里面的函數(shù)沒被使用跳纳,那這個(gè)heMain.o文件便不會出現(xiàn)最后的可執(zhí)行文件中张峰。

Objective-C鏈接過程有什么不同?

oc是動態(tài)性語言棒旗,對象方法的實(shí)現(xiàn)只有到被調(diào)用時(shí)候才被確定喘批。基于這個(gè)原因铣揉,Objective-C沒有方法級別定義符號饶深,只有類級別定義符號。

舉個(gè)例子

main.c中包含以下代碼: [[FooClass alloc] initWithBar:nil]; 那么在鏈接的時(shí)候逛拱,main.o文件就會生成一個(gè)未定義符號如:(Undefined Symbols) FooClass敌厘,但不會定義initWithBar方法的符號。

坑在哪朽合?

Category只是一個(gè)類的分類

  • 如果靜態(tài)庫中已經(jīng)定義這個(gè)類, 鏈接器就會認(rèn)為這個(gè)類已經(jīng)存在都鏈接過了, 還鏈接啥俱两。不會把分類這個(gè)類 的代碼合起來, 所以會缺少分類里的代碼, 報(bào)錯(cuò)selector not recognized
  • 如果靜態(tài)庫中沒有定義這個(gè)類的,Category只是一個(gè)方法的集合曹步,而Objective-C沒有方法級別定義符號宪彩。于所以連接器不會加載Cateogry生成的文件。

解決方法

在Other Linker Flags里加上所需的參數(shù)讲婚,用到的參數(shù)一般有以下3個(gè):
-ObjC
-all_load
-force_load

  • 首先是-ObjC尿孔,連接器會把靜態(tài)庫中所有的Objective-C類和分類都加載到最后的可執(zhí)行文件中,雖然這樣可能會因?yàn)榧虞d了很多不必要的文件而導(dǎo)致可執(zhí)行文件變大

重要提示: 對于64位和iPhone OS應(yīng)用程序,當(dāng)靜態(tài)庫只包含類別活合,沒有類, 會存在一個(gè)鏈接器bug雏婶,它阻止-ObjC從靜態(tài)庫加載對象文件

  • 再說說-all_load, 會讓鏈接器把所有找到的目標(biāo)文件都加載到可執(zhí)行文件中

重要提示: 假如你使用了不止一個(gè)靜態(tài)庫文件,那么很可能會遇到ld: duplicate symbol錯(cuò)誤白指,因?yàn)椴煌膸煳募锩婵赡軙邢嗤哪繕?biāo)文件

  • 最后說說-force_load, 做的事跟-all_load一樣, 但是-force_load需要指定庫文件路徑留晚,這樣, 就只是完全加載了一個(gè)庫文件,不影響其余庫文件告嘲。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末倔丈,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子状蜗,更是在濱河造成了極大的恐慌需五,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件轧坎,死亡現(xiàn)場離奇詭異宏邮,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)缸血,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進(jìn)店門蜜氨,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人捎泻,你說我怎么就攤上這事飒炎。” “怎么了笆豁?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵漾峡,是天一觀的道長毅人。 經(jīng)常有香客問我吵血,道長慎璧,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任哄孤,我火速辦了婚禮照筑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘瘦陈。我一直安慰自己凝危,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布晨逝。 她就那樣靜靜地躺著蛾默,像睡著了一般。 火紅的嫁衣襯著肌膚如雪咏花。 梳的紋絲不亂的頭發(fā)上趴生,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機(jī)與錄音昏翰,去河邊找鬼苍匆。 笑死,一個(gè)胖子當(dāng)著我的面吹牛棚菊,可吹牛的內(nèi)容都是我干的浸踩。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼统求,長吁一口氣:“原來是場噩夢啊……” “哼检碗!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起码邻,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤折剃,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后像屋,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怕犁,經(jīng)...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年己莺,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了奏甫。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,503評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡凌受,死狀恐怖阵子,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情胜蛉,我是刑警寧澤挠进,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站誊册,受9級特大地震影響奈梳,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜解虱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一攘须、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧殴泰,春花似錦于宙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至离咐,卻和暖如春谱俭,著一層夾襖步出監(jiān)牢的瞬間奉件,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工昆著, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留县貌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓凑懂,卻偏偏與公主長得像煤痕,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子接谨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評論 2 359

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

  • 背景在iOS開發(fā)過程中摆碉,有時(shí)候會用到第三方的靜態(tài)庫(.a文件),然后導(dǎo)入后發(fā)現(xiàn)編譯正常但運(yùn)行時(shí)會出現(xiàn)selecto...
    petry閱讀 988評論 0 1
  • 摘要: 在ios開發(fā)過程中脓豪,有時(shí)候會用到第三方的靜態(tài)庫(.a文件)巷帝,然后導(dǎo)入后發(fā)現(xiàn)編譯正常但運(yùn)行時(shí)會出現(xiàn)selec...
    陳云峰閱讀 148評論 0 0
  • 在ios開發(fā)過程中,有時(shí)候會用到第三方的靜態(tài)庫(.a文件)扫夜,然后導(dǎo)入后發(fā)現(xiàn)編譯正常但運(yùn)行時(shí)會出現(xiàn)selector ...
    Baby小豬閱讀 322評論 0 7
  • 背景 在ios開發(fā)過程中锅睛,有時(shí)候會用到第三方的靜態(tài)庫(.a文件),然后導(dǎo)入后發(fā)現(xiàn)編譯正常但運(yùn)行時(shí)會出現(xiàn)select...
    LYapple閱讀 349評論 0 0
  • 在iOS開發(fā)過程中历谍,有時(shí)候會用到第三方的靜態(tài)庫(.a文件)现拒,然后導(dǎo)入后發(fā)現(xiàn)編譯正常但運(yùn)行時(shí)會出現(xiàn)selector ...
    iCoders閱讀 504評論 0 1