1. 程式人生 > >使用拆分庫的方法解決iOS中Duplicate Symbol靜態庫衝突

使用拆分庫的方法解決iOS中Duplicate Symbol靜態庫衝突

在自己寫SDK或者使用第三方庫的時候,可能會遇到編譯時Duplicate Symbol錯誤,本文就是通過使用拆分庫的方法,將庫中衝突的目標檔案去除,以解決此類問題。

遇到此類問題,一般都是兩個庫中包含了相同的目標檔案導致,可以通過去除其中一個庫中的衝突目標檔案來解決。

大致解決思路如下:

  1. 檢視庫支援的框架型別
  2. 使用lipo命令分別將.a拆分成庫所支援框架型別的.a庫
  3. 使用ar命令刪除對應框架型別.a庫中衝突的.o目標檔案
  4. 使用lipo命令將處理後的各個框架.a庫進行合併即可

具體操作步驟如下

  1. 檢視庫支援的框架型別
    現有的框架型別應該就是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
  2. 使用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
  3. 使用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
  4. 使用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
    這就沒有遺漏了

到此,將合併後的庫重新新增到工程中,測試一下,如果將所有衝突的目標檔案都去除了,衝突問題因此解決了。