Other Link Flag 其他鏈接標(biāo)志腻豌,代碼鏈接的時(shí)候有關(guān)和鏈接器有關(guān)。
1.程序代碼到可執(zhí)行文件:
源代碼 > 預(yù)處理器 > 編譯器 > 匯編器 > 機(jī)器碼 > 鏈接器 > 可執(zhí)行文件
源文件經(jīng)過一系列處理以后回怜,會(huì)生成對(duì)應(yīng)的.obj文件距辆,然后一個(gè)項(xiàng)目必然會(huì)有許多.obj文件,并且這些文件之間會(huì)有各種各樣的聯(lián)系蔽氨,例如函數(shù)調(diào)用藐唠。鏈接器做的事就是把這些目標(biāo)文件和所用的一些庫(kù)鏈接在一起形成一個(gè)完整的可執(zhí)行文件。
2.Other Link Flag 引起崩潰的原因在于Objective-C的鏈接器并不會(huì)為每個(gè)方法建立符號(hào)表鹉究,而是僅僅為類建立了符號(hào)表宇立。這樣的話,如果靜態(tài)庫(kù)中定義了已存在的一個(gè)類的分類自赔,鏈接器就會(huì)以為這個(gè)類已經(jīng)存在妈嘹,不會(huì)把分類和核心類的代碼合起來。這樣的話绍妨,在最后的可執(zhí)行文件中润脸,就會(huì)缺少分類里的代碼,這樣函數(shù)調(diào)用就失敗了他去。
3.解決方法便是在xcode Other Link flag 處加上標(biāo)識(shí)津函。
-ObjC
-all_load
-force_load
-ObjC 加了這個(gè)參數(shù)后,鏈接器就會(huì)把靜態(tài)庫(kù)中所有的Objective-C類和分類都加載到最后的可執(zhí)行文件中孤页,雖然這樣可能會(huì)因?yàn)榧虞d了很多不必要的文件而導(dǎo)致可執(zhí)行文件變大尔苦。
-all_load會(huì)讓鏈接器把所有找到的目標(biāo)文件都加載到可執(zhí)行文件中,但是千萬不要隨便使用這個(gè)參數(shù)!假如你使用了不止一個(gè)靜態(tài)庫(kù)文件允坚,然后又使用了這個(gè)參數(shù)魂那,那么你很有可能會(huì)遇到ld: duplicate symbol錯(cuò)誤,因?yàn)椴煌膸?kù)文件里面可能會(huì)有相同的目標(biāo)文件稠项,所以建議在遇到-ObjC失效的情況下使用-force_load參數(shù)涯雅。
-force_load所做的事情跟-all_load其實(shí)是一樣的,但是-force_load需要指定要進(jìn)行全部加載的庫(kù)文件的路徑展运,這樣的話活逆,你就只是完全加載了一個(gè)庫(kù)文件,不影響其余庫(kù)文件的按需加載拗胜。
4.一般沖突由于.a是由于.o文件組成蔗候,靜態(tài)庫(kù)沖突主要原因是因?yàn)橛兄貜?fù)部分,將兩個(gè)靜態(tài)庫(kù)去除重復(fù)部分重新合并埂软。