iOS程序开发引用的第三方库之间出现冲突的处理方法 对原文个别不是特别清楚地方,进行完善。 原文地址:http://www.cocoachina.com/bbs/read.php?tid=188289 项目中免不了要用到第三方库,有的时候引用的第三方库多了,可能库与库之间会产生类名重叠导致冲突的问题。 最近在项目中就遇到了这样的事情,索性完美解决了,因此纪录一下。 最近项目需求要用到百度推送来做推送服务,当我把百度push的ios客户端集成到程序后,程序运行不起来来,报错误,大概意思是AlipayRsaLib.a这个库里面的一个Base64.o与项目里的有冲突,集成百度push sdk的时候确实拖进来了Base64.h和Base64.m两个文件,于是猜想肯定是AlipayRsaLib.a这个库里面集成了Base64这个类,这个库本是支付宝开发的一个客户端快捷支付的插件,看来支付宝坑爹了!在百度搜了一通,找到一个解决方法(http://blog.csdn.net/kafeidev/article/details/8678685),使用lipo命令将不同cpu架构的.a文件先剥离出来,然后剔除Base64.o文件,最后重新将不同架构的.a文件合并成AlipayRsaLib.a,这个方法试了一下,基本可行,不过lipo命名只能识别armv7和之前的架构,对于armv7s却不能识别,又辗转到 http://stackoverflow.com 找到另外一个命令,xcrun -sdk iphoneos lipo 所有的问题都解决了 (后面就不自己写了,直接copy过来稍加改动了) 开console,找到要解剖的.a文件,执行下列命令查看库包含的cpu架构代码: xcrun -sdk iphoneos lipo -info libx.a Architectures in the fat file: libx.a are: i386 armv7 armv7s //此处如果直接使用lipo命令看到的会是: i386 armv7 (cputype(12)subcputyp(11)) 然后用 xcrun -sdk iphoneos lipo -extract_family armv7 -output libx-inter.a libx.a 分离出arm版本的.a,这里有个小问题,按我的理解此命令应该对包含3种cpu代码的.a里的armv6部分进行操作,而实际分离出来的.a却是同时包含armv7和armv7s的部分,也就是依然是”fat” lib,这样是不能抽出.o的,因此还需要进行以下操作: 对libx-inter.a: lipo libx-inter.a -thin armv7 -output libx-armv7.a lipo libx-inter.a -thin armv7s -output libx-armv7s.a 对libx.a: lipo libx-inter.a -thin i386 -output libx-i386.a 这样就能分离出2份不同版本arm的.a了和一份i386.a,然后进行解.o操作: ar -x libx-armv7.a ar -x libx-armv7s.a ar -x libx-i386.a 这部操作最好放到单独的文件夹里进行,会将link出.a的所有.o还原出来,然后有两种选择:一是把所有库对应cpu架构的部分都还原到这个位置,然后将重复的部分合并为一份,接着用后面的命令将所有.o再合并为一份公共lib。还有一种选择就是保留重复符号中的一份lib完好如初,将其余lib单独解开,剔出重复符号存在的.o,然后将该lib重新link回.a,以去除重复符号。 不管用哪种方法解决,最后的link回命令如下: libtool -static -o ../libx-armv7.a *.o libtool -static -o ../libx-armv7s.a *.o libtool -static -o ../libx-i386.a *.o 当然,别忘了咱们的库都是有多份cpu架构指令的,所以,先要对每种cpu arch的库进行同样操作,然后还要将thin lib合并回fat lib: lipo -create -output libx.a libx-armv7.a libx-i386.a libx-armv7s.a 这样,再link回自己的app时就不会再出现duplicate symbol了。