關(guān)于Xcode的Other Linker Flags

摘要: 在ios開發(fā)過程中汉规,有時(shí)候會用到第三方的靜態(tài)庫(.a文件),然后導(dǎo)入后發(fā)現(xiàn)編譯正常但運(yùn)行時(shí)會出現(xiàn)selector not recognized的錯(cuò)誤娜氏,從而導(dǎo)致app閃退抽活。接著仔細(xì)閱讀庫文件的說明文檔子巾,你可能會在文檔中發(fā)現(xiàn)諸如在Other Linker Flags中加入-ObjC或者-all_load這樣的解決方法衣吠。 那么茶敏,Other Linker Flags到底是用來干什么的呢?還有-ObjC和-all_load到底發(fā)揮了什么作用呢蒸播?

鏈接器

首先睡榆,要說明一下Other Linker Flags到底是用來干嘛的。說白了袍榆,就是ld命令除了默認(rèn)參數(shù)外的其他參數(shù)。ld命令實(shí)現(xiàn)的是鏈接器的工作塘揣,詳細(xì)說明可以在終端man ld查看包雀。

如果有人不清楚鏈接器是什么東西的話,我可以作個(gè)簡單的說明亲铡。

一個(gè)程序從簡單易讀的代碼到可執(zhí)行文件往往要經(jīng)歷以下步驟:

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

源文件經(jīng)過一系列處理以后才写,會生成對應(yīng)的.obj文件,然后一個(gè)項(xiàng)目必然會有許多.obj文件奖蔓,并且這些文件之間會有各種各樣的聯(lián)系赞草,例如函數(shù)調(diào)用。鏈接器做的事就是把這些目標(biāo)文件和所用的一些庫鏈接在一起形成一個(gè)完整的可執(zhí)行文件吆鹤。

可能我描述的比較膚淺厨疙,因?yàn)槲易约毫私獾囊膊皇呛苌睿ㄗh大家讀一下這篇文章疑务,可以對鏈接器做的事情有個(gè)大概的了解:鏈接器做了什么

為什么會閃退

蘋果官方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.

翻譯過來沾凄,大概意思就是Objective-C的鏈接器并不會為每個(gè)方法建立符號表梗醇,而是僅僅為類建立了符號表。這樣的話撒蟀,如果靜態(tài)庫中定義了已存在的一個(gè)類的分類叙谨,鏈接器就會以為這個(gè)類已經(jīng)存在,不會把分類和核心類的代碼合起來保屯。這樣的話手负,在最后的可執(zhí)行文件中,就會缺少分類里的代碼姑尺,這樣函數(shù)調(diào)用就失敗了虫溜。

解決方法

解決方法在背景那塊我就提到了,就是在Other Linker Flags里加上所需的參數(shù)股缸,用到的參數(shù)一般有以下3個(gè):

-ObjC

-all_load

-force_load

下面來說說每個(gè)參數(shù)存在的意義和具體做的事情衡楞。

首先是-ObjC,一般這個(gè)參數(shù)足夠解決前面提到的問題敦姻,蘋果官方說明如下:

This flag causes the linker to load every object file in the library that defines an Objective-C class or category. While this option will typically result in a larger executable (due to additional object code loaded into the application), it will allow the successful creation of effective Objective-C static libraries that contain categories on existing classes.

簡單說來瘾境,加了這個(gè)參數(shù)后,鏈接器就會把靜態(tài)庫中所有的Objective-C類和分類都加載到最后的可執(zhí)行文件中镰惦,雖然這樣可能會因?yàn)榧虞d了很多不必要的文件而導(dǎo)致可執(zhí)行文件變大迷守,但是這個(gè)參數(shù)很好地解決了我們所遇到的問題。但是事實(shí)真的是這樣的嗎旺入?

如果-ObjC參數(shù)真的這么有效兑凿,那么事情就會簡單多了。

Important: For 64-bit and iPhone OS applications, there is a linker bug that prevents -ObjC from loading objects files from static libraries that contain only categories and no classes. The workaround is to use the -allload or -forceload flags.

當(dāng)靜態(tài)庫中只有分類而沒有類的時(shí)候茵瘾,-ObjC參數(shù)就會失效了礼华。這時(shí)候,就需要使用-all_load或者-force_load了拗秘。

-all_load會讓鏈接器把所有找到的目標(biāo)文件都加載到可執(zhí)行文件中圣絮,但是千萬不要隨便使用這個(gè)參數(shù)!假如你使用了不止一個(gè)靜態(tài)庫文件雕旨,然后又使用了這個(gè)參數(shù)扮匠,那么你很有可能會遇到ld: duplicate symbol錯(cuò)誤,因?yàn)椴煌膸煳募锩婵赡軙邢嗤哪繕?biāo)文件凡涩,所以建議在遇到-ObjC失效的情況下使用-force_load參數(shù)棒搜。

-force_load所做的事情跟-all_load其實(shí)是一樣的,但是-force_load需要指定要進(jìn)行全部加載的庫文件的路徑活箕,這樣的話力麸,你就只是完全加載了一個(gè)庫文件,不影響其余庫文件的按需加載。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末末盔,一起剝皮案震驚了整個(gè)濱河市筑舅,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌陨舱,老刑警劉巖翠拣,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異游盲,居然都是意外死亡误墓,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進(jìn)店門益缎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來谜慌,“玉大人,你說我怎么就攤上這事莺奔⌒婪叮” “怎么了?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵令哟,是天一觀的道長恼琼。 經(jīng)常有香客問我,道長屏富,這世上最難降的妖魔是什么晴竞? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮狠半,結(jié)果婚禮上噩死,老公的妹妹穿的比我還像新娘。我一直安慰自己神年,他們只是感情好已维,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪鹅士。 梳的紋絲不亂的頭發(fā)上眶明,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機(jī)與錄音既琴,去河邊找鬼占婉。 笑死,一個(gè)胖子當(dāng)著我的面吹牛甫恩,可吹牛的內(nèi)容都是我干的逆济。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼奖慌!你這毒婦竟也來了抛虫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤简僧,失蹤者是張志新(化名)和其女友劉穎建椰,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體岛马,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡棉姐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了啦逆。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片伞矩。...
    茶點(diǎn)故事閱讀 38,100評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖夏志,靈堂內(nèi)的尸體忽然破棺而出乃坤,到底是詐尸還是另有隱情,我是刑警寧澤沟蔑,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布湿诊,位于F島的核電站,受9級特大地震影響溉贿,放射性物質(zhì)發(fā)生泄漏枫吧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一宇色、第九天 我趴在偏房一處隱蔽的房頂上張望九杂。 院中可真熱鬧,春花似錦宣蠕、人聲如沸例隆。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽镀层。三九已至,卻和暖如春皿曲,著一層夾襖步出監(jiān)牢的瞬間唱逢,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工屋休, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留坞古,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓劫樟,卻偏偏與公主長得像痪枫,于是被迫代替她去往敵國和親织堂。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,834評論 2 345

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