iOS开发中静态库(.a)制作
Xcode 9
一般iOS 开发者都会引用第三的库
- 库根据根据源代码的公开情况 分为两种
- 开源。如:MJRefresh,AFNetworking
- 闭源。又分为
静态
、动态
。
一、静态库和动态库的区别:
静态库和动态库是相对编译期和运行期的,静态库以.a
和 .framework
形式存在,链接时,静态库会被完整地复制到可执行文件中,被多次使用就有多份冗余拷贝;动态库以 .dylib
(iOS 7.0以前,iOS 8 之后.tbd
) 和 .framework 形式存在,链接时不复制,程序运行时由系统动态加载到内存,供程序调用,系统只加载一次,多个程序共用,节省内存,一般只能由系统创建。
- 由于iOS 开发语言限制 。Swift 只支持 动态库(iOS 8.0 ),OC ->
.a
(iOS 7.0).framework
(iOS 8.0)
二、静态库简介:
1、静态库分为真机—Debug(调试)版本、真机—Release(发布)版本、模拟器—Debug版本、模拟器—Release版本;开发中一般都打包Release(发布)版本,将真机和模拟器版本合并,提供外界。
2、使用场景:在项目开发的过程中,例如两个公司之间业务交流,不可能把源代码都发送给另一个公司,这时候将私密内容打包成静态库,别人只能调用接口,而不能知道其中实现的细节。
静态库(.a)
- 创建.a 静态库
创建工程 ,选择Cocoa Touch Static Library
创建.a
静态库
创建之后会默认生成一个和库名一样的文件夹和 类(XCode 7 好像没有生成类 需要自己手动创建)
RMVersionToos.h
#import <Foundation/Foundation.h>
@interface RMVersionTool : NSObject
+ (NSString*)rm_getVersion;
@end
RMVersionTool.m
@implementation RMVersionTool
+ (NSString*)rm_getVersion {
return [NSBundle mainBundle].infoDictionary[@"CFBundleShortVersionString"];
}
@end
2.编译之后会生成.a
文件如下图
别人用我们生成的库 需要头文件 这时我就就需要吧我的的
.h
文件暴露出去
- 第一种方式:直接把所有需要暴露的头文件copy出去(不推荐)
-
第二种方式:用系统的CopyFile 添加对应的文件夹包含所有的头文件如下图(个人推荐)
-
第三种方式:用系统的header File 生成如下图
第二种生成文件目录
第三种生成文件目录
- 测试
- 新建一个工程 ,并导入刚才创建的.a 静态库 在
模拟器 IPhone 8
上测试可以 ,但是更换到模拟器iPhone 5
编译报错如下
为什么呢?
每一个设备都有自己的CPU架构,每一个静态库也有自己支持的CPU架构
对于iOS 模拟器- iPhone4s~5 : i386
- iPhone5s~8plus : x86_64
真机 - iPhone 3gs ~ 4s : armv7
- iPhone5~5c: armv7s
- iPhone6~ : arm64
armv6, armv7, armv7s是ARM CPU的不同指令集,原则是向下兼容的。例如iPhone4S CPU支持armv7, 但它同时兼容armv6,只是使用armv6指令可能无法充分发挥它的特性。
查看静态库
.a
对处理器架构的支持lipo -info xxx.a
-
解决不支持架构-->>Build Active Architecture Only中的Debug如果为YES,就是说只能调试当前活跃的架构,我们当前选中的即是活跃的,所以设置为No即可
由于真机和模拟器架构
不一样 所以我们要分别针对模拟器
和真机
生成不同的.a
库
真机生成 在真机下编译 ,模拟器生成在模拟器下编译
最后会生成两个静态库 合并两个静态库 终端命令:
lipo -create 静态库1名 静态库2名 -output 新静态库名称