編譯問題: "ld: duplicate symbol _OBJC_METACLASS_$_XXX..."


在新的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

 

如果現有的sdk 需要添加flag   "-all_load"  但是添加完以后導致其他庫的沖突.  解決方法是刪除-all_load  用  _force_load  代替   並在后面加上必須使用-all_laod的庫的路徑 

在build settings的linker flags中添加:

1.  -force_load $(SRCROOT)/xxx/xxxxx.a


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM