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
这是因为小米的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
相关文章推荐
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 峰回路转,Firefox 浏览器即将重返 iOS 平台
- 不可修补的 iOS 漏洞可能导致 iPhone 4s 到 iPhone X 永久越狱
- iOS 12.4 系统遭黑客破解,漏洞危及数百万用户
- 每日安全资讯:NSO,一家专业入侵 iPhone 的神秘公司
- [转][源代码]Comex公布JailbreakMe 3.0源代码
- 讲解iOS开发中基本的定位功能实现
- js判断客户端是iOS还是Android等移动终端的方法
- IOS开发环境windows化攻略
- 浅析iOS应用开发中线程间的通信与线程安全问题
- 检测iOS设备是否越狱的方法
- .net平台推送ios消息的实现方法
- 探讨Android与iOS,我们将何去何从?
- Android、iOS和Windows Phone中的推送技术详解
- IOS 改变键盘颜色代码
- 举例详解iOS开发过程中的沙盒机制与文件
- Android和IOS的浏览器中检测是否安装某个客户端的方法
- 分享一个iOS下实现基本绘画板功能的简单方法
- javascript实现阻止iOS APP中的链接打开Safari浏览器