- 今天有机会写一篇静态库相关的文章,小谷是做
SDK的,对我们来说,动/静态库的制作和调试对我们来说很重要的。
1. 动/静态库的说明
- 首先 我们先要了解下
动态库和静态库,才能知道什么时候使用。
1 . 静态库 :主要后缀名是
.a和.framework2 . 动态库:后缀名是
.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 . 好了,就到这了,希望这篇博客可以帮助下兄弟们