iOS 静态库冲突问题解决办法
高****师 · 高****师 发布于2016-06-07 11:11 浏览:3128 回复:0

在引入第三方lib(.a)库时,经常会由于第三方lib库中又引入同你现有工程相同的开源代码而造成.o冲突,只有想办法分离了静态库文件了。
常见的静态库编译冲突报错如下:
duplicate symbol _SSL_SRP_CTX_free in:
    /Users/Yerik/Documents/workspace/SDK/iOS/Live/Baidu-Capture-SDK-iOS-1.0.0/LiveDemo/LiveDemo/resource/libCyberPlayerController.a(tls_srp.o)
    /Users/Yerik/Documents/workspace/SDK/iOS/Live/Baidu-Capture-SDK-iOS-1.0.0/LiveDemo/LiveDemo/resource/libssl.a(tls_srp.o)
ld: 4718 duplicate symbols for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

1.依次查看lib库所支持的框架类型。i386:模拟器,armv7:iphone4,armv7s:iphone5,iphone5s,arm64:iphone6,iphone6p
$ lipo -info lib.a
Architectures in the fat file: lib.a are: armv7 armv7s arm64
fat file:表示该lib库文件中合并了多个框架的lib库,这里合并的有armv7 armv7s arm64。如果同时合并了模拟器的lib库,这里还会有i386的标识。

2.分离出armv7,armv7s类型的.a库
$ lipo -extract_family armv7 -output lib_armv7.a lib.a

$ lipo -info lib_armv7.a
Architectures in the fat file: lib_armv7.a are: armv7 armv7s

查看发现分离出来的lib_armv7.a仍旧是fat文件,只有Non-fat文件才可以分离.o。所以仍然需要进行进一步分离。

$ lipo lib_armv7.a -thin armv7 -output lib_final_armv7.a

$ lipo lib_armv7.a -thin armv7s -output lib_final_armv7s.a

$ lipo -info lib_final_armv7.a
input file lib_final_armv7.a is not a fat file
Non-fat file: lib_final_armv7.a is architecture: armv7

$ lipo -info lib_final_armv7s.a
input file lib_final_armv7s.a is not a fat file
Non-fat file: lib_final_armv7s.a is architecture: armv7s
此时分离出来的已经是Non-fat文件了,才可进行分离.o。

3.分离arm64类型的.a库
arm64是iOS系统最新增加的框架,按照分离armv7,armv7s的方式无论如何都无法分离出arm64版本的Non-fat文件,经过多次试验发现可以通过下面命令直接分离。
$ lipo lib.a -thin arm64 -output lib_final_arm64.a
$ lipo -info lib_final_arm64.a
input file lib_final_arm64.a is not a fat file
Non-fat file: lib_final_arm64.a is architecture: arm64
4.分离i386(模拟器)类型的.a库
$ lipo -extract_family i386 -output lib_final_i386.a lib.a
$ lipo -info lib_final_i386.a
input file lib_final_i386.a is not a fat file
Non-fat file: lib_final_i386.a is architecture: i386

5.分离目标文件.o
通过上面的分离则可将armv7、armv7s、arm64、i386框架的lib库一一分离出来,接下来针对每个框架分别创建一个文件夹用来保存从.a库中分离出来的.o文件。下面以armv7为例:
$ mkdir armv7
$ cd armv7
$ ar -x ../lib_final_armv7.a
其他同理

6.从分离出的.o中删除冲突的.o,再将其余.o文件合并成lib(.o)
$ libtool -static -o ../libarmv7.a *.o
其他同理

7.合并最终的通用静态库
$ lipo -create -output libs.a libarmv7.a libarmv7s.a libarm64.a
$ lipo -info libs.a
Architectures in the fat file: libs.a are: armv7 armv7s arm64

点赞  ( 0 )
收藏
评论(0)
TOP