編譯iOS程式時的-all_load選項,以及-all_load 導致的 ld duplicate symbol xx的問題,ios-all_load

來源:互聯網
上載者:User

編譯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後面必須跟一個只想靜態庫的路徑。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.