- 今天有机会写一篇静态库相关的文章,小谷是做
SDK
的,对我们来说,动/静态库
的制作和调试对我们来说很重要的。
1. 动/静态库的说明
- 首先 我们先要了解下
动态库
和静态库
,才能知道什么时候使用。
1 . 静态库 :主要后缀名是
.a
和.framework
2 . 动态库:后缀名是
.tbd、.dylib 、.framework
静态库
和动态库
的区别
1 . 静态库
链接
时直接复制
到可执行文件中。2 . 动态库
链接
时不进行复制
,而是dyld加载
时,链接到内存。
.framework
有可能是动态库
,也可能是静态库
。
可以通过
lipo -info 'xxx.framework/xxx'
进行查看。
2. 静态库
2.1. 静态库的制作
直接步入正题了,演示一波
静态库
的制作流程。
- 1 . 我们新建一个工程 如下图所示。选取
Static Library
- 2 . 选择自己想取的工程名
Xcode13以上
创建没有Products
目录,不要着急
- 3 . 显示
Products
目录- 1 . 显示包内容,找到工程文件
- 2 . 更改
productRefGroup
为mainGroup
的值 - 3 . 重新打开工程
这个时候
Products
目录 就出现了 - 1 . 显示包内容,找到工程文件
- 4 . 我们就用这个工程吧,然后在.h 文件写方法声明,.m里面写实现,代码如下
.h
@interface staticlibDemo : NSObject
+ (instancetype)sharedInstance;
-(NSInteger)sum:(NSInteger)a with:(NSInteger)b;
@end
.m
@implementation staticlibDemo
+ (instancetype)sharedInstance{
static staticlibDemo *single = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
single = [[self alloc] init];
});
return single;
}
-(NSInteger)sum:(NSInteger)a with:(NSInteger)b{
return a + b;
}
@end
我们制作
静态库
的时候对外接口
一般都会写一个单利
- 5 . 编译设置,对外公开的文件为
.h
- 6 . 编译
生成.a库
和头文件.h
- 7 . 把
生成.a库
和头文件.h
放到一个新建文件夹
中, 其他工程就可以引用使用了
了
2.2. 静态库联调
简单的
静态库
已经制作完成了,但是我们有时候要对静态库联调
,实时
修改工程,不能每次都要编译添加
,这个时候就需要关联工程
了.
- 1 . 我们首先将
静态库工程
,拖入到调试工程
中
- 2 . 我们
关闭静态库工程
,重新打开
调试工程
- 3 . 我们在把
原先的库移除
并把静态库工程
的库加入
原先的库移除
静态库工程
的库加入
- 4 . 好了,这个时候就可以联调了,可以修改代码了。
注:.framework 静态库
制作流程差不多的(需要在build setting
中的macho type
设置成Static Library
)。这里就不多说了。
3. 总结
-
1 .
静态库
已经说的差不多了,动态库
其实我们很少制作,不过制作方式都一样的。 -
2 . 对于研究过
编译、链接、启动
的兄弟们可能也比较了解动态库
和静态库
的区别了。无非就是macho
的链接方式 -
3 . 大多数公司都会要求制作
静态库
,毕竟苹果对动态库
有要求。 -
4 . 好了,就到这了,希望这篇博客可以帮助下兄弟们