在构建iOS静态库与静态Framework的时候,为了方便,我们经常需要把用于模拟器的x86_64版本和用于真机不同架构的库合并起来,命令很简单:
lipo -create for_simulator.a for_device.a -output universal.a
在使用第三方依赖的时候,如果第三方依赖以二进制库文件的形式存在,偶尔会遇到不同的第三方依赖又引用了相同的其他依赖,导致符号重复的链接错误,解决的办法也不复杂,从某一个第三方依赖的二进制库中把重复的目标文件剔除,方法也很简单:
- 通过xcode的链接错误找到产生冲突的第三方依赖
- 选其中一个或者几个依赖,列出依赖的二进制库包含的处理器架构
lipo -info target.a
- 将所有处理器架构分离出来,以armv6为例
lipo -extract_family armv6 -output target-armv6.a target.a
- 将分离出来的二进制文件进一步分离成目标文件
ar -x target-armv6.a
- 上一步将在当前文件夹下生成库文件包含的所有目标文件,将需要剔除的目标文件删掉,并且重新合并库文件
libtool -static -o target.a *.o
- 对所有处理器架构都按3到5处理完成后,将不同处理器架构的库文件合并为一个,不再赘述
值得注意的是,当第三方依赖引用了相同的其他依赖时,有可能因为实现版本不同而产生陷阱,这种情况只能联系第三方依赖的供应商来咨询和解决了。
网友评论