使用拆分库的方法解决iOS中Duplicate Symbol静态库冲突

96
HK_Hank
0.1 2016.08.23 23:22* 字数 714

在自己写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 
  1. 使用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
  1. 使用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
  1. 使用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 

这就没有遗漏了

到此,将合并后的库重新添加到工程中,测试一下,如果将所有冲突的目标文件都去除了,冲突问题因此解决了。

iOS技术整理