原先在项目中加入了百度云推送的sdk,看PDF集成的需要base64.h/base64.m的俩文件,之后一直没有没什么问题。直到要在项目中加入支付宝sdk的。按照说明集成配置完的。一编译直接包错了。
四处问了,确定应该是百度推送需要引入的base64.h/base64.m和支付宝sdk里面的AlipayRsaLib里面包含的base.o的一样的冲突。
开始还是想着.a的静态库的动不了那只有试着删除百度sdk引入的俩文件的,但是这俩文件一删除的。直接照成了百度推送的不能使用。。。
所以还是找其它方法的解决。开始也有人介绍如何合并.a的资料但是没接触过还是不敢弄。后来庆幸找到了一哥跟我一样的情况的。网址:点击打开链接,按照上面说的步奏一步步的试下来。开始的时候只移除了i386和armv7里面的base64.o保留了armv7s里面的。发现在模拟器上运行的真的可以编译通过了。但是真机运行还是会报上面的错误的。想想是不是armv7s没有移除的问题的。但是移除了全部的不知道对支付宝sdk的有没有影响的。所以还是和支付宝的客服询问了一下(支付宝客服还是很不错滴)。经过半天的了解。告诉了他们我的情况:在项目中已经加入了base64.h/base64.m的这俩文件的,那么将支付宝AlipayRsaLib.a里的base64.o的移除也是没有影响的。贴图:
所以,索性将armv7s里面的base64.o的一并移除了。再重新打了一个没有包含base64.o的库出来的。将它替换到测试的项目中运行的没有报错。用真机付款成功的也可以正常操作。试了百度推送的也是能正常运行的。
自己拷贝份保存下
- (后面就不自己写了,直接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了。
贴出没有base64.o的AlipayRsaLib.a的地址:点击打开链接(支付宝版本v1.2,以后版本更新了如果修改了要重新按照原先的方法制作一份)
以上转载自:http://blog.csdn.net/sinyran/article/details/20708791
上边不懂的可以参考接下来的