使用拆分庫的方法解決iOS中Duplicate Symbol靜態庫衝突
阿新 • • 發佈:2019-01-02
在自己寫SDK或者使用第三方庫的時候,可能會遇到編譯時Duplicate Symbol錯誤,本文就是通過使用拆分庫的方法,將庫中衝突的目標檔案去除,以解決此類問題。
遇到此類問題,一般都是兩個庫中包含了相同的目標檔案導致,可以通過去除其中一個庫中的衝突目標檔案來解決。
大致解決思路如下:
- 檢視庫支援的框架型別
- 使用lipo命令分別將.a拆分成庫所支援框架型別的.a庫
- 使用ar命令刪除對應框架型別.a庫中衝突的.o目標檔案
- 使用lipo命令將處理後的各個框架.a庫進行合併即可
具體操作步驟如下
- 檢視庫支援的框架型別
現有的框架型別應該就是i386、x86_64、armv7、arm64這個幾個了,這裡以微信的SDK為例,在終端中對應路徑下輸入以下命令,檢視支援的框架型別
在終端可以看到結果,支援armv7、i386、x86_64、arm64這個幾個框架型別lipo
Architectures in the fat file: libWeChatSDK.a are: armv7 i386 x86_64 arm64
- 使用lipo命令分別將.a拆分成庫所支援框架型別的.a庫
因為微信的SDK支援armv7、i386、x86_64、arm64這個幾個框架型別,所以我們需要分別將其拆分成對應的四個框架型別的庫,輸入以下命令
可以看到以下生成的幾個檔案lipo libWeChatSDK.a -thin armv7 -output libWeChatSDK_armv7.a
libWeChatSDK_arm64.a libWeChatSDK_x86_64.a libWeChatSDK_armv7.a libWeChatSDK_i386.a libWeChatSDK.a
- 使用ar命令刪除其中一個.a的衝突的.o
如果Xcode裡提示Duplicate Symbol都是說xxx.o與xxx.o衝突,則我們就刪除的對應的xxx.o目標檔案,比如我們刪除amr64框架下面的xxx.o目標檔案,輸入以下命令
這裡,只需要刪除衝突框架中的xxx.o檔案即可,比如說,只有在i386這個框架下,編譯報錯提示提示Duplicate Symbol都是說xxx.o與xxx.o衝突,其他框架編譯正常,則只需要輸入以下命令即可ar -d libWeChatSDK_arm64.a xxx.o
ar -d libWeChatSDK_i386.a xxx.o
- 使用lipo命令將處理後的各個框架.a庫合併
當我們將衝突的目標檔案刪除之後,我們可以做收尾工作了。將處理過的的各個框架型別的庫進行合併,命令如下
合併之後,記得檢查一下合併庫支援的框架型別,看看有沒有遺漏lipo -create -output libWeChatSDK.a libWeChatSDK_i386.a libWeChatSDK_x86_64.a libWeChatSDK_armv7.a libWeChatSDK_arm64.a
看到支援的框架lipo -info libWeChatSDK.a
這就沒有遺漏了Architectures in the fat file: libWeChatSDK.a are: armv7 i386 x86_64 arm64
到此,將合併後的庫重新新增到工程中,測試一下,如果將所有衝突的目標檔案都去除了,衝突問題因此解決了。