Xcode中other linker flags 的作用

使用場景

<p> 在ios開發(fā)中某筐,我們經(jīng)常會(huì)使用到第三方的一些靜態(tài)庫,導(dǎo)入第三方類庫運(yùn)行程序后你會(huì)發(fā)現(xiàn),編譯時(shí)可以正常編譯但是運(yùn)行時(shí)會(huì)app會(huì)閃退,報(bào)出selector not recognized的錯(cuò)誤踪央。一般的第三方庫的開發(fā)文檔中都會(huì)寫出這種問題的解決方法,如在Other Linker Flags中加入-ObjC或者-all_load或者-force_load這樣的解決方法胳喷。為什要這要做呢?報(bào)錯(cuò)為什么編譯的時(shí)候有問題呢,首先我們先引入一個(gè)鏈接器的概念.</p>

鏈接器

<p>
還記得我們在學(xué)習(xí)C程序的時(shí)候排抬,從C代碼到可執(zhí)行文件經(jīng)歷的步驟是:
</p>

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

在最后一步需要把.o文件和C語言運(yùn)行庫鏈接起來铐姚,這時(shí)候需要用到ld命令痪伦。源文件經(jīng)過一系列處理以后残制,會(huì)生成對應(yīng)的.obj文件苫纤,然后一個(gè)項(xiàng)目必然會(huì)有許多.obj文件碉钠,并且這些文件之間會(huì)有各種各樣的聯(lián)系,例如函數(shù)調(diào)用卷拘。鏈接器做的事就是把這些目標(biāo)文件和所用的一些庫鏈接在一起形成一個(gè)完整的可執(zhí)行文件
通過這個(gè)流程你也應(yīng)該知道為什么在編譯的過程中沒事而在運(yùn)行的時(shí)候就會(huì)報(bào)錯(cuò)了. 那我們?yōu)槭裁匆O(shè)置Other Linker Flags呢 因?yàn)镺ther Linker Flags其實(shí)就是鏈接器工作時(shí)除了默認(rèn)參數(shù)外的其他參數(shù)喊废。

閃退的原因

蘋果官方Q&A上有這么一段話:

The "selector not recognized" runtime exception occurs due to an issue between the implementation of standard UNIX static libraries, the linker and the dynamic nature of Objective-C. Objective-C does not define linker symbols for each function (or method, in Objective-C) - instead, linker symbols are only generated for each class. If you extend a pre-existing class with categories, the linker does not know to associate the object code of the core class implementation and the category implementation. This prevents objects created in the resulting application from responding to a selector that is defined in the category.

翻譯:運(yùn)行時(shí)的異常時(shí)由于靜態(tài)庫,鏈接器,與OC語言的動(dòng)態(tài)的特性之間的問題,OC語言并不是對每一個(gè)函數(shù)或者方法建立符號表,而只是對每一個(gè)類創(chuàng)建了符號表.如果一個(gè)類有了分類,那么鏈接器就不會(huì)將核心類與分類之間的代碼完成進(jìn)行合并,這就阻止了在最終的應(yīng)用程序中的可執(zhí)行文件缺失了分類中的代碼,這樣函數(shù)調(diào)用接失敗了.

other linker flags參數(shù)的作用

在前面我們說如果出現(xiàn)問題要在Other Linker Flags中加入-ObjC或者-all_load或者-force_load,我們?yōu)槭裁匆尤脒@樣的參數(shù)呢,他們究竟做了什么事呢?下面就是對這個(gè)三個(gè)參數(shù)的一個(gè)講解.

ObjC

一般這個(gè)參數(shù)足夠解決前面提到的問題,這個(gè)flag告訴鏈接器把庫中定義的Objective-C類和Category都加載進(jìn)來。這樣編譯之后的app會(huì)變大,因?yàn)榧虞d了很多不必要的文件而導(dǎo)致可執(zhí)行文件變大栗弟。但是如果靜態(tài)庫中有類和category的話只有加入這個(gè)flag才行,但是Objc也不是萬能的,當(dāng)靜態(tài)庫中只有分類而沒有類的時(shí)候,Objc就失效了,這就需要使用-all_load或者-force_load了污筷。

-all_load

-all_load會(huì)強(qiáng)制鏈接器把目標(biāo)文件都加載進(jìn)來,即使沒有objc代碼乍赫。但是這個(gè)參數(shù)也有一個(gè)弊端,那就是你使用了不止一個(gè)靜態(tài)庫文件瓣蛀,那么你很有可能會(huì)遇到ld: duplicate symbol錯(cuò)誤,因?yàn)椴煌膸煳募锩婵赡軙?huì)有相同的目標(biāo)文件 這里會(huì)有兩種方法解決 1:用命令行就行拆包. 2:就是用下面的這個(gè)參數(shù)

-force_load

這個(gè)flag所做的事情跟-all_load其實(shí)是一樣的雷厂,只是-force_load需要指定要進(jìn)行全部加載的庫文件的路徑惋增,這樣的話,你就只是完全加載了一個(gè)庫文件改鲫,不影響其余庫文件的按需加載 .

總結(jié)

個(gè)人建議ObjC與force_load搭配使用比較好.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末诈皿,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子像棘,更是在濱河造成了極大的恐慌稽亏,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,000評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缕题,死亡現(xiàn)場離奇詭異截歉,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)烟零,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,745評論 3 399
  • 文/潘曉璐 我一進(jìn)店門瘪松,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咸作,“玉大人,你說我怎么就攤上這事宵睦⌒院辏” “怎么了?”我有些...
    開封第一講書人閱讀 168,561評論 0 360
  • 文/不壞的土叔 我叫張陵状飞,是天一觀的道長。 經(jīng)常有香客問我书斜,道長诬辈,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,782評論 1 298
  • 正文 為了忘掉前任荐吉,我火速辦了婚禮焙糟,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘样屠。我一直安慰自己穿撮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,798評論 6 397
  • 文/花漫 我一把揭開白布痪欲。 她就那樣靜靜地躺著悦穿,像睡著了一般。 火紅的嫁衣襯著肌膚如雪业踢。 梳的紋絲不亂的頭發(fā)上栗柒,一...
    開封第一講書人閱讀 52,394評論 1 310
  • 那天,我揣著相機(jī)與錄音知举,去河邊找鬼瞬沦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛雇锡,可吹牛的內(nèi)容都是我干的逛钻。 我是一名探鬼主播,決...
    沈念sama閱讀 40,952評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼锰提,長吁一口氣:“原來是場噩夢啊……” “哼曙痘!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起欲账,我...
    開封第一講書人閱讀 39,852評論 0 276
  • 序言:老撾萬榮一對情侶失蹤屡江,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后赛不,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體惩嘉,經(jīng)...
    沈念sama閱讀 46,409評論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,483評論 3 341
  • 正文 我和宋清朗相戀三年踢故,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了文黎。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惹苗。...
    茶點(diǎn)故事閱讀 40,615評論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖耸峭,靈堂內(nèi)的尸體忽然破棺而出桩蓉,到底是詐尸還是另有隱情,我是刑警寧澤劳闹,帶...
    沈念sama閱讀 36,303評論 5 350
  • 正文 年R本政府宣布院究,位于F島的核電站,受9級特大地震影響本涕,放射性物質(zhì)發(fā)生泄漏业汰。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,979評論 3 334
  • 文/蒙蒙 一菩颖、第九天 我趴在偏房一處隱蔽的房頂上張望样漆。 院中可真熱鬧,春花似錦晦闰、人聲如沸放祟。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,470評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽跪妥。三九已至,卻和暖如春窿冯,著一層夾襖步出監(jiān)牢的瞬間骗奖,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,571評論 1 272
  • 我被黑心中介騙來泰國打工醒串, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留执桌,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,041評論 3 377
  • 正文 我出身青樓芜赌,卻偏偏與公主長得像仰挣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子缠沈,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,630評論 2 359

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