iOS程序开发引用的第三方库之间出现冲突的处理方法
项目中免不了要用到第三方库,有的时候引用的第三方库多了,可能库与库之间会产生类名重叠导致冲突的问题。
最近在项目中就遇到了这样的事情,索性完美解决了,因此纪录一下。
最近项目需求要用到百度推送来做推送服务,当我把百度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的,因此还需要进行以下操作:
lipo libx-inter.a -thin armv7 -output libx-armv7.a lipo libx-inter.a -thin armv7s -output libx-armv7s.a
这样就能分离出2份不同版本arm的.a了,然后进行解.o操作:
ar -x libx-armv7.a
这部操作最好放到单独的文件夹里进行,会将link出.a的所有.o还原出来,然后有两种选择:一是把所有库对应cpu架构的部分都还原到这个位置,然后将重复的部分合并为一份,接着用后面的命令将所有.o再合并为一份公共lib。还有一种选择就是保留重复符号中的一份lib完好如初,将其余lib单独解开,剔出重复符号存在的.o,然后将该lib重新link回.a,以去除重复符号。
不管用哪种方法解决,最后的link回命令如下:
libtool -static -o ../libx-armv7.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了。
最近在项目中就遇到了这样的事情,索性完美解决了,因此纪录一下。
最近项目需求要用到百度推送来做推送服务,当我把百度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的,因此还需要进行以下操作:
lipo libx-inter.a -thin armv7 -output libx-armv7.a lipo libx-inter.a -thin armv7s -output libx-armv7s.a
这样就能分离出2份不同版本arm的.a了,然后进行解.o操作:
ar -x libx-armv7.a
这部操作最好放到单独的文件夹里进行,会将link出.a的所有.o还原出来,然后有两种选择:一是把所有库对应cpu架构的部分都还原到这个位置,然后将重复的部分合并为一份,接着用后面的命令将所有.o再合并为一份公共lib。还有一种选择就是保留重复符号中的一份lib完好如初,将其余lib单独解开,剔出重复符号存在的.o,然后将该lib重新link回.a,以去除重复符号。
不管用哪种方法解决,最后的link回命令如下:
libtool -static -o ../libx-armv7.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了。