Xcode中導入.a靜態庫后報錯添加-force_load或-all_load


第一種方法:
       以前在做項目的時候在Xcode中倒入一個三方SDK的時候,會有一些.a的靜態庫,這時候如果直接編譯運行就會報錯。當時只知道往build settings的linker flags 里面添加-force_load和.a文件的路徑。最近又多次用到,這里總結一下。
 
例如在Xcode中倒入一個SIPSKDK,如下,這里面包含了一個.a的靜態庫。
    Xcode中導入.a靜態庫后報錯添加-force_load或-all_load
 
 如果直接運行的沒用到里面方法的時候運行時沒問題的,但是一旦導入頭文件,並創建SIPClient對象的時候就會報錯,如下所示: Xcode中導入.a靜態庫后報錯添加-force_load或-all_load

這里報錯的原因主要是Xcode找不到里面.a文件中的類,所以需要在build settings的linker flags 中添加-ObjC來告訴鏈接器,把庫中的類和category都加載進來,這樣編譯后app會變大,因為加載了其它的OC代碼進來。
 
而且如果.a靜態庫中只有分類沒有類的話這樣也不行。這時候就要在添加了-ObjC的基礎上再添加一行-all_load.
-all_load是專門處理-ObjC的一個bug的,用了-ObjC后,如果類庫中只有category,沒有類的話,這樣category還是加載不進來。這時候再加入-all_load就是告訴鏈接器強制把所有的目標文件都加載進來。但是這樣在導入多個.a文件的時候如果都這樣做,可能會導致你的目標程序大小增大,而且往往容易引起一些沖突,而這些沖突往往你無法解決(常常出現在你鏈接的各種庫中)。
這時候可以使用-force_load只加載你方法所需要的庫,但是使用它需要再添加.a文件的路徑。不需再添加-ObjC
 
所以比較好的解決辦法就是在build settings的linker flags中添加兩個:

1.  -force_load
2.  .a文件的路徑(例如在上面SDK: $(SRCROOT)/lib/libbaidumapapi.a)

Xcode中導入.a靜態庫后報錯添加-force_load或-all_load

這樣運行就OK了。

 
 
 
第二種方法:
在集成第三方框架的時候 ,報了"_BIO_ctrl", referenced from:等一系列錯誤
  • 沒有將兩個.a文件拖入工程。

    集成支付寶報"_BIO_ctrl", referenced from錯
  • 2

    找到iOS DEMO,將上圖紅框框住的兩個.a文件導入工程即可。


免責聲明!

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



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