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

来源:互联网 发布:java 接口 编辑:程序博客网 时间:2024/06/01 20:47
144 
作者 HK_Hank 关注
2016.08.23 23:22 字数 250 阅读 174评论 0

在自己写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.alipo libWeChatSDK.a -thin i386 -output libWeChatSDK_i386.alipo libWeChatSDK.a -thin x86_64 -output libWeChatSDK_x86_64.alipo libWeChatSDK.a -thin arm64 -output libWeChatSDK_arm64.a
    可以看到以下生成的几个文件
    libWeChatSDK_arm64.a    libWeChatSDK_x86_64.alibWeChatSDK_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
    这就没有遗漏了

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


阅读全文
0 0
原创粉丝点击