iOS引入小米push SDK出现duplicate symbol时的解决方法

        iOS工程引入小米push SDK链接时出现一连串duplicate symbol错误,例如:

   

    

        这是因为小米的SDK库中包含了与其他第三方库相同的.o文件,当一个工程集成了较多的第三方库时,很容易出现这个问题。 解决的方法是去重,因为同一个函数库只需要引入一次就可以,因此我们可以将小米SDK中相应的.o文件删除掉。

        首先我们在终端切换到 libMiPushSDK.a 所在的目录下。.a文件是静态链接库文件。所谓静态链接是指把要调用的函数或者过程链接到可执行文件中,成为可执行文件的一部分。.a文件是多个.o文件的组合。.o文件就是对象文件,里面包含的内容就是01这样的机器可执行的指令,当程序要执行时还需要进行链接(link).链接就是把多个.o文件链成一个可执行文件。

        执行命令查看 libMiPushSDK.a 的属性:

                lipo -info libMiPushSDK.a

        得到的结果是:

                Architectures in the fat file: libMiPushSDK.a are: i386 armv7 armv7s x86_64 arm64 

        意思是说 libMiPushSDK.a是一个fat file,里面集成了i386、armv7、x86_64等编译环境下相应的.a文件。所以我们需要把它们分离出来,一个一个做完处理,再重新集合起来,做成一个新的静态库链接文件。

        这里以x86_64下的.a文件为例,步骤如下:

        1. 首先把相应静态库链接文件从 libMiPushSDK.a 中分离出来,执行命令:lipo libMiPushSDK.a -thin x86_64 -output libMix86.a  得到一个libMix86.a文件。

        2. 取出 libMix86.a 所包含的.o文件。执行命令:ar -x libMix86.a  得到一大堆 ***.o文件。

        3. 删除冲突的.o文件。执行命令: rm XMPPMessage.o

        4. 重新合成一个新的.a文件。执行命令: libtool -static -o libMix86.a *.o


        这样我们就得到了一个不包含冲突函数库的静态库链接文件。其他编译环境的 .a 文件以此类推,最后有 libMix86.a 、libMii386.a 、libMiarmv7.a 、libMiarmv7s.a 、

libMiarm64.a ,再将它们合成一个新的sdk链接库:

        lipo -create -output libMiPushSDK.a  libMix86.a libMii386.a libMiarmv7.a libMiarmv7s.a libMiarm64.a

        至此,我们生成了一个新的 libMiPushSDK.a 文件,用它覆盖相应的同名文件,再编译就不会出错了。


        PS: 如果需要删除的文件较多,那么建议写成shell脚本,将命令放进去,减小出错率和工作量。

        vim removeObj.sh

       

 文件内容:

        #!/usr/bin/env bash

        rm XMPPMessage.o

        ...........

        ...........


      

 执行脚本:

        sh  removeObj.sh 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值