您的位置:首页 > 移动开发 > IOS开发

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

2016-01-12 16:22 344 查看
        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 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息