今是昨非

今是昨非

日出江花红胜火,春来江水绿如蓝

lib(a)導致的duplicate-symbol的問題

lib (a) 導致的 duplicate-symbol 的問題#

鏈接:

  1. iOS lib (.a) 庫衝突解決辦法
  2. iOS 兩個靜態庫存在同名文件衝突解決方案

說明#

首先你要確定是這個類型的錯誤
image1

然後開始,可以按照第一個鏈接進行修改,也可以看下面

在引入第三方 lib (.a) 庫時,經常會由於第三方 lib 庫中又引入同你現有工程相同的開源代碼而造成.o 衝突

依次查看 lib 庫所支持的框架類型。#

i386:模擬器;
armv7:iphone4;
armv7s:iphone5,iphone5s;
arm64:iphone6,iphone6p。

  1. 首先,將衝突的那個.a 文件單獨拷貝到一個文件夾,然後用命令行進入到那個文件夾
    image1

  2. 查看 lib 庫支持的框架類型,注意下面的 lib.a 或者 libRyFitLibrary.a 是我出錯的.a 文件

admin-imac:testlib admin$ lipo -info lib.a 2 Architectures in the fat file: lib.a are: armv7
armv7s arm64 3 admin-imac:testlib admin$

image2

fat file:表示該 lib 庫文件中合併了多個框架的 lib 庫,這裡合併的有 armv7 arm64。如果同時合併了模擬器的 lib 庫,這裡還會有 i386 的標識。  

分離出 armv7 類型的.a 庫#

admin-imac:testlib admin$ lipo -extract_family armv7 -output lib_armv7.a lib.a  
admin-imac:testlib admin$ lipo -info lib_armv7.a 3 Architectures in the fat file: lib_armv7.a are: armv7 armv7s

image3

 如果發現分離出來的 lib_armv7.a 仍舊是 fat 文件,需要進行進一步分離。只有 Non-fat 文件才可以分離.o。所以仍然

分離 arm64 類型的.a 庫#

  arm64 是 iOS 系統最新增加的框架,按照分離 armv7,armv7s 的方式無論如何都無法分離出 arm64 版本的 Non-fat 文件,經過多次試驗發現可以通過下面命令直接分離。

admin-imac:testlib admin$ lipo lib.a -thin arm64 -output lib_final_arm64.a
admin-imac:testlib admin$ lipo -info lib_final_arm64.a 
input file lib_final_arm64.a is not a fat file
Non-fat file: lib_final_arm64.a is architecture: arm64

image4

分離目標文件.o  #

通過上面的分離則可將 armv7、arm64 框架的 lib 庫一一分離出來,接下來針對每個框架分別創建一個文件夾用來保存從.a 庫中分離出來的.o 文件。其他同理
下面以 armv7 為例:

admin-imac:testlib admin$ mkdir armv72
admin-imac:testlib admin$ cd armv73 
admin-imac:armv7 admin$ ar -x ../lib_final_armv7.a

image5

到這裡再看一下我最初的錯誤,
image1
看到是 Reachability.o 的問題,通過上面的 ls 命令,能夠看到確實兩個文件夾裡都有這個.o 文件。

從分離出的.o 中刪除衝突的.o,所有的文件夾裡的都要刪除,下面只演示了一個#

image6

再將其餘.o 文件合併成 lib (.o),注意所在的文件夾#

admin-imac:arm64 admin$ libtool -static -o ../libarm64.a *.o

image7
可以看到最終多了兩個,libarm64.a 和 libarmv7.a 就是我們刪除衝突文件後,新生成的.a 文件

合併最終的通用靜態庫#


admin-imac:testlib admin$ lipo -create -output libs.a libarmv7.a libarmv7s.a libarm64.a 
admin-imac:testlib admin$ lipo -info libs.a 
Architectures in the fat file: libs.a are: armv7 armv7s arm64

image8

載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。