iOS 静态库冲突 两个不同的.o 文件冲突 ,静态库分离


在开发期间集成ZBar 和 支付 的时候,发现很多提示是.o文件冲突,最常见的时base64冲突,原因是由于不少第三方静态库中都有base64这个文件
在网上查了许久,发现都是转载的同一篇文章,由于对console命令不熟悉,也花费了一番功夫,请教了高手,,终于还是搞定了
下面附上方法,

打开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))
/Users/HELLO/Desktop/libcrypto.a 是文件路径
bogon:~ HELLO$ lipo -info /Users/HELLO/Desktop/libcrypto.a
Architectures in the fat file: /Users/HELLO/Desktop/libcrypto.a are: armv7 armv7s i386 x86_64 arm64

然后用
xcrun -sdk iphoneos lipo -extract_family i386 -output libx-i386.a libx.a
xcrun -sdk iphoneos lipo -extract_family armv7 -output libx-inter.a libx.a

bogon:~ HELLO$  lipo -extract_family i386 -output /Users/HELLO/Desktop/libcrypto-i386.a /Users/HELLO/Desktop/libcrypto.a 
bogon:~ HELLO$  lipo -extract_family armv7 -output /Users/HELLO/Desktop/libcrypto-inter.a /Users/HELLO/Desktop/libcrypto.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

bogon:~ HELLO$ lipo /Users/HELLO/Desktop/libcrypto-inter.a -thin armv7 -output /Users/HELLO/Desktop/libcrypto-armv7.a
bogon:~ HELLO$ lipo /Users/HELLO/Desktop/libcrypto-inter.a -thin armv7s -output /Users/HELLO/Desktop/libcrypto-armv7s.a 

这样就能分离出2份不同版本arm的.a了,然后进行解.o操作:
ar -x libx-armv7.a
这部操作最好放到单独的文件夹里进行
/Users/HELLO/Desktop/armv7/)桌面上的文件armv7文件夹路径
在文件夹里面进行操作本步骤
bogon:home HELLO$ cd /Users/HELLO/Desktop/armv7/ 
bogon:armv7 HELLO$ ar -x /Users/HELLO/Desktop/armv7/libcrypto-armv7.a
,会将link出.a的所有.o还原出来,然后有两种选择:一是把所有库对应cpu架构的部分都还原到这个位置,然后 将重复的部分合并为一份,接着用后面的命令将所有.o再合并为一份公共lib。还有一种选择就是保留重复符号中的一份lib完好如初,将其余lib单独解 开,剔出重复符号存在的.o,然后将该lib重新link回.a,以去除重复符号。
不管用哪种方法解决,最后的link回命令如下:
libtool -static -o ../libx-armv7.a *.o
bogon:armv7 HELLO$ libtool -static -o ../libcrypto-armv7.a *.o【.a 和 * 号之间有一个空格】
仍然在armv7文件夹里操作,会在armv7的上一级文件中重新生成.a文件(由于我的上一级目录是桌面所以直接覆盖了原先桌面的文件)
我查了下这个” has no symbols”好像只是提示性质,不是错误提示
当然,别忘了咱们的库都是有多份cpu架构指令的,所以,先要对每种cpu arch的库进行同样操作,然后还要将thin lib合并回fat lib:
lipo -create -output libx.a libx-armv7.a libx-i386.a libx-armv7s.a
最后合并成一个.a文件替换工程里的.a文件就行了
这样,再link回自己的app时就不会再出现duplicate symbol了。

你可能感兴趣的:(纠错)