在自己寫SDK或者使用第三方庫的時候,可能會遇到編譯時Duplicate Symbol錯誤含鳞,本文就是通過使用拆分庫的方法付呕,將庫中沖突的目標文件去除,以解決此類問題娃磺。
遇到此類問題薄湿,一般都是兩個庫中包含了相同的目標文件導致,可以通過去除其中一個庫中的沖突目標文件來解決偷卧。
大致解決思路如下:
- 查看庫支持的框架類型
- 使用lipo命令分別將.a拆分成庫所支持框架類型的.a庫
- 使用ar命令刪除對應框架類型.a庫中沖突的.o目標文件
- 使用lipo命令將處理后的各個框架.a庫進行合并即可
具體操作步驟如下
- 查看庫支持的框架類型
現(xiàn)有的框架類型應該就是i386豺瘤、x86_64、armv7听诸、arm64這個幾個了,這里以微信的SDK為例坐求,在終端中對應路徑下輸入以下命令,查看支持的框架類型
lipo -info libWeChatSDK.a
在終端可以看到結果晌梨,支持armv7桥嗤、i386、x86_64仔蝌、arm64這個幾個框架類型
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
lipo libWeChatSDK.a -thin i386 -output libWeChatSDK_i386.a
lipo libWeChatSDK.a -thin x86_64 -output libWeChatSDK_x86_64.a
lipo libWeChatSDK.a -thin arm64 -output libWeChatSDK_arm64.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目標文件篓像,輸入以下命令
ar -d libWeChatSDK_arm64.a xxx.o
這里,只需要刪除沖突框架中的xxx.o文件即可皿伺,比如說员辩,只有在i386這個框架下,編譯報錯提示提示Duplicate Symbol都是說xxx.o與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
這就沒有遺漏了
到此杰赛,將合并后的庫重新添加到工程中,測試一下乏屯,如果將所有沖突的目標文件都去除了蛤迎,沖突問題因此解決了。