一個程序從簡單易讀的代碼到可執(zhí)行文件往往要經(jīng)歷一下步驟:
源碼>預(yù)處理器>編譯器>匯編器>機(jī)器碼>鏈接器>可執(zhí)行文件
源文件經(jīng)過一系列處理后,會生成對應(yīng)的.obj文件,一個項目中會生成很多的.obj文件,且這些文件之間會有各種各樣的聯(lián)系。鏈接器要做的事情就是把這些.obj文件和所用的一些庫鏈接在一起形成一個完整的可執(zhí)行文件。鏈接器做了什么
ios開發(fā)中一般會用到幾個參數(shù)
- -Objc
- -all_load
- -force_load
使用-Objc后,連接器就會把靜態(tài)庫中所有的Objective-C類和分類都加載到最后的可執(zhí)行文件中,這樣可能會因?yàn)榧虞d了很多不必要的文件導(dǎo)致可執(zhí)行文件變大。
當(dāng)靜態(tài)庫中只有分類而沒有類的時候,-Objc參數(shù)就會失效。這個時候就需要使用-all_load或者-force_load了。
-all_load會讓鏈接器把所有能找到的目標(biāo)文件都加載到可執(zhí)行文件中,但是千萬不要隨便使用這個參數(shù)!假如你使用了不止一個靜態(tài)庫文件,然后又使用了這個參數(shù),那么你很有可能會遇到ld:duplicate symbol錯誤,因?yàn)椴煌瑤煳募锩婵赡軙邢嗤哪繕?biāo)文件,建議在-Objc失效的情況下再使用-force_load參數(shù)。
-force_load所做的事情跟-all_load其實(shí)是一樣的,但是-force_load需要指定要進(jìn)行全部加載的庫文件的路徑,這樣的話,你就只是完全加載了一個庫文件,不影響其余庫文件的按需加載。