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