編譯iOS程式時的-all_load選項,以及-all_load 導致的 ld duplicate symbol xx的問題,ios-all_load
在新的SDK環境中調試百度地圖的應用程式時,app總是意外退出,找了半天發現錯誤的原因是unrecognized selector xx的錯誤,另外還有報了一個Unknown class XXX in Interface Builder file的錯誤,找了一下百度官方的資料,官方建議是app的Build Settings中的Other Linker Flags中增加-all_oad選項,但是我的app中還串連了其他靜態庫,加了這個選項之後,編譯的時候報了 ld duplicate symbol xx的錯誤,於是又去蘋果官網找了一下資料,發現有個類似功能的選項-ObjC,在編譯選項中將-all_load改為-ObjC後,app編譯和運行正 常,附上apple官方的介紹:
https://developer.apple.com/library/mac/#qa/qa2006/qa1490.html
官方的說明是app中連結的靜態庫中使用了Category(類別),在編譯到靜態庫時,這些代碼模組實際上是存在不同的obj檔案裡的。程式在連 接Category方法時,實際上只載入了Category模組,擴充的基類代碼並沒有被載入。這樣,程式雖然可以編譯通過,但是在運行時,因為找不到基 類別模組,就會出現unrecognized selector 這樣的錯誤。-all_load就是解決上述問題,類似的還可以用-force_load、-ObjC。 再附上一個相關的資料:
http://stackoverflow.com/questions/2300867/how-can-i-avoid-duplicate-symbol-errors-in-xcode-with-shared-static-libraries/2300873#2300873
另外一種解釋方式:
-ObjC
這個flag告訴連結器把庫中定義的Objective-C類和Category都載入進來。這樣編譯之後的app會變大(因為載入了其他的objc代碼進來)。但是如果靜態庫中有類和category的話只有加入這個flag才行。
-all_load
這個flag是專門處理-ObjC的一個bug的。用了-ObjC以 後,如果類庫中只有category沒有類的時候這些category還是載入不進來。變通方法就是加入-all_load或者-force- load。-all_load會強制連結器把目標檔案都載入進來,即使沒有objc代碼。-force_load在xcode3.2後可用。但是 -force_load後面必須跟一個只想靜態庫的路徑。