美文网首页
ios 面试题 iOS多个静态库中,相同的.o文件冲突

ios 面试题 iOS多个静态库中,相同的.o文件冲突

作者: _逍遥客 | 来源:发表于2018-02-27 15:41 被阅读26次

    在开发期间集成ZBar 和 支付 的时候,发现很多提示是.o文件冲突,最常见的时base64冲突,原因是由于不少第三方静态库中都有base64这个文件.

    下面附上方法,打开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了。

    文章来源:http://blog.csdn.net/jiangnanshuilu/article/details/44056939

    相关文章

      网友评论

          本文标题:ios 面试题 iOS多个静态库中,相同的.o文件冲突

          本文链接:https://www.haomeiwen.com/subject/pikmxftx.html