支付宝AlipayRsaLib.a中删除base64.o

由于目前项目中集成了支付宝和 ZBar 二维码库,支付宝的 AlipayRsaLib.a 与 ZBar 的 base64.o 同名,导致编译不通过。搜索后发现这个冲突似乎是不光在他俩之间,在百度地图SDK以及 TencentOpenAPI 中都存在类似冲突。
在支付宝论坛中查找后得知 AlipayRsaLib.a 并不依赖 base64.o,因此我们可以把 base64.o 从中删除。

下面是从 AlipayRsaLib.a 中删除 base64.o 的操作。

1. 查看.a文件支持的 CPU 架构

lipo -info AlipayRsaLib.a
# 输出:Architectures in the fat file: AlipayRsaLib.a are: armv7 armv7s i386

2. 按照平台拆分.a文件

lipo AlipayRsaLib.a -thin armv7 -output AlipayRsaLib-armv7.a
lipo AlipayRsaLib.a -thin armv7s -output AlipayRsaLib-armv7s.a
lipo AlipayRsaLib.a -thin i386 -output AlipayRsaLib-i386.a

拆分后的.a文件分别放到不同文件夹下。

在网上看到lipo -thin命令不支持 armv7s 的,这个我并没有遇到,可以看看lipo info是否有输出 armv7s 有的话应该就是可以拆分出来的,我是可以正常拆分的。

3. 解压拆分后的.a文件

ar -x AlipayRsaLib-armv7.a 
ar -x armv7s/AlipayRsaLib-armv7s.a
ar -x AlipayRsaLib-armv7s.a

注意:上面三个命令是分别在三个不同的文件夹下执行的

解压后可以删除对应的.o文件,这里删除的是base64.o。注意要在三个文件夹里吧这个文件全部删除

4. 合并解压后的.o文件

libtool -static -o ../libnew-i386.a *.o
libtool -static -o ../libnew-armv7.a *.o
libtool -static -o ../libnew-armv7s.a *.o

注意:上面三个命令同样是分别在三个不同的文件夹下执行的

5. 合并重新生成的.a文件

lipo -create -output lib.a libnew-armv7.a libnew-armv7s.a libnew-i386.a

至此我们就把AlipayRsaLib.a中的base64.o给删除掉了

参考

关于支付宝sdk和百度云推送sdk引入的base64.o编译报错问题
iOS解决两个静态库的冲突 duplicate symbol
iOS 两个静态库存在同名文件冲突解决方案
iOS程序开发引用的第三方库之间出现冲突的处理方法