Xcode在生成库(.a或.framework)的时候,通常会生成两个版本,一个是用于真机的版本,一个是用于模拟器的版本
- 真机:
armv7
,armv7s
,arm64
架构 - 模拟器:
i386
,x86_64
如果在库和项目在同一个工程中,通常会自动根据当前是模拟器还是真机自动引用相关的库文件
在使用第三方库的时候通常只有一个.a库,这个库既能用于真机调试,又能用于模拟器调试,这个时候我们需要对不同的架构的库进行合并
使用lipo
对不同架构的库进行合并,在编译的时候会自动识别
一、.a库合并与拆分
例如有两个不同架构的库liba-arm64.a
, liba-i386.a
查看库的架构信息
1
2
3lipo -info liba-arm64.a
input file liba-arm64.a is not a fat file
Non-fat file: liba-arm64.a is architecture: arm64如果静态库支持多种架构,那么就是一个
fat file
合并两个库
1
lipo -create liba-arm64.a liba-i386.a -output liba.a
合并成
liba.a
到当前目录抽取出
arm64
库1
lipo liba.a -thin arm64 -output liba-arm64.a
二、.Framework库合并与拆分
.framework库与.a库类似,只是.framework库可以包含Header和Bundle,其实相当于一个目录,所以操作的是里面的库文件,而不是xxx.framework
文件
例如有两个不同架构的库
IJKMediaFramework_x86_64.framework
IJKMediaFramework_arm64.framework
- 查看.framework信息
1
2
3lipo -info IJKMediaFramework_arm64.framework/IJKMediaFramework
input file IJKMediaFramework_arm64.framework/IJKMediaFramework is not a fat file
Non-fat file: IJKMediaFramework_arm64.framework/IJKMediaFramework is architecture: arm64 - 合并库
1
lipo -create IJKMediaFramework_x86_64.framework/IJKMediaFramework IJKMediaFramework_arm64.framework/IJKMediaFramework -output IJKMediaFramework
得到通用的库IJKMediaFramework
替换到IJKMediaFramework_x86_64.framework/IJKMediaFramework
,这时候IJKMediaFramework_x86_64.framework
就是通用framework
- 抽取出
arm64
库1
lipo IJKMediaFramework_x86_64.framework/IJKMediaFramework -thin x86_64 -output IJKMediaFramework
三、xcode脚本自动合并库
如果是自己生成的库,有个技巧,xcode生成库的时候自动执行脚本完成合并的操作,需要选择真机和模拟器分别编译一遍
在Build Phases添加Run Script
1 | # 编译的时候 |
切换到Release模式,分别切换到模拟器和真机编译一次,编译完成后会自动打开输出文件夹,通过lipo
命令查看
完成,接下来可以直接用了合并后的库了