淺談Xcode的Other linker flags

今天項目中要嵌入別人的SDK,但他們又沒有提供使用文檔,這可苦了我,出現(xiàn)了這樣的錯誤。


C2C7F4BE-BD55-4783-A87F-F433654BABA6.png

花費了我好長時間才想起來哪里出的錯誤,最后我添加了配置就OK了。


IIHPIUDM7Z}98I()`7T4J%J.jpg

那么就介紹一下這些參數(shù)吧。

Targets選項下有Other linker flags的設置,用來填寫XCode的鏈接器參數(shù),如:-ObjC -all_load -force_load等。
還記得我們在學習C程序的時候,從C代碼到可執(zhí)行文件經(jīng)歷的步驟是:
源代碼 > 預處理器 > 編譯器 > 匯編器 > 機器碼 > 鏈接器 > 可執(zhí)行文件
在最后一步需要把.o文件和C語言運行庫鏈接起來,這時候需要用到ld命令。源文件經(jīng)過一系列處理以后,會生成對應的.obj文件,然后一個項目必然會有許多.obj文件,并且這些文件之間會有各種各樣的聯(lián)系,例如函數(shù)調用。鏈接器做的事就是把這些目標文件和所用的一些庫鏈接在一起形成一個完整的可執(zhí)行文件。
如果要詳細研究鏈接器做了什么,請看:http://www.dutor.net/index.php/2012/02/what-linkers-do/

那么,Other linker flags設置的值實際上就是ld命令執(zhí)行時后面所加的參數(shù)。

下面逐個介紹3個常用參數(shù):
-ObjC:加了這個參數(shù)后,鏈接器就會把靜態(tài)庫中所有的Objective-C類和分類都加載到最后的可執(zhí)行文件中。如果靜態(tài)庫中有category,那么需要添加 -ObjC 參數(shù)標識,否則可能會報:unrecognized selector sent to instance

-all_load:會讓鏈接器把所有找到的目標文件都加載到可執(zhí)行文件中,但是千萬不要隨便使用這個參數(shù)!假如你使用了不止一個靜態(tài)庫文件,然后又使用了這個參數(shù),那么你很有可能會遇到ld: duplicate symbol錯誤,因為不同的庫文件里面可能會有相同的目標文件,所以建議在遇到-ObjC失效的情況下使用-force_load參數(shù)。

-force_load:所做的事情跟-all_load其實是一樣的,但是-force_load需要指定要進行全部加載的庫文件的路徑,這樣的話,你就只是完全加載了一個庫文件,不影響其余庫文件的按需加載。

看到這里知道我為什么編譯出錯了吧。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容