iOS 静态库冲突 两个不同的.o 文件冲突 ,静态库分离
2018-01-17 00:00
344 查看
在开发期间集成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了。
在网上查了许久,发现都是转载的同一篇文章,由于对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了。
相关文章推荐
- iOS 静态库冲突 两个不同的.o 文件冲突 ,静态库分离
- iOS 两个静态库存在同名文件冲突解决方案
- C#中,有两个不同的CS文件,但这两个文件具有相同的命名空间(namespace)。一个CS文件要用另一个CS文件中的类的话,下面有一个处理方式。
- iOS - .a静态库的打包(包括打包的文件中用到了一些别人的三方库和分类的处理)
- shell 比较两个文件不同 sort comm
- iOS 创建静态库文件时去掉其中的Symbols
- ios静态库.a文件打包
- pig加载两个不同字段个数的文件?load file with different items(f1有42列,f2有43列读到一个对象中)
- 找出两个文件之间的不同
- Linux diff --比较两个文件并输出不同之处
- iOS 中plist文件中配置key值冲突的现象
- 两个不同的类相互引用的情况下头文件包含问题
- 哈希表冲突的两个解决方法线性探测和分离链接法
- 读取两个压缩包,比较文件夹及文件内容的不同之处并添加到另一个文件夹打包下载
- iOS项目生成静态库文件(.a)
- 【幻灯片分享】揭开IPA文件的灰沙 -- 通过静态分析工具了解IPA实现 | 友盟 张超 | iOS DevCamp
- 查找两个word文件的不同
- 远程调用imzc.net博客更新的JS文件(当然,和RSS是两个不同的方向)
- git 比较同一文件的不同的两个版本之间的差异
- ios delegate代理,多个/不同/两个view之间传递数据,传递批量数据,多个数据