美文网首页iOS学习iOS 开发 iOS Developer
使用拆分库的方法解决iOS中Duplicate Symbol静态

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

作者: HK_Hank | 来源:发表于2016-08-23 23:22 被阅读777次

    在自己写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中Duplicate Symbol静态

        本文链接:https://www.haomeiwen.com/subject/owknsttx.html