静态库的制作和调试

621 阅读3分钟

小谷博客合集

  • 今天有机会写一篇静态库相关的文章,小谷是做SDK的,对我们来说,动/静态库的制作和调试对我们来说很重要的。

1. 动/静态库的说明

  • 首先 我们先要了解下动态库静态库,才能知道什么时候使用。

1 . 静态库 :主要后缀名是.a .framework

2 . 动态库:后缀名是 .tbd、.dylib 、.framework

  • 静态库动态库的区别

1 . 静态库 链接时直接复制到可执行文件中。

2 . 动态库 链接不进行复制,而是dyld加载时,链接到内存。

  • .framework 有可能是动态库,也可能是静态库

可以通过 lipo -info 'xxx.framework/xxx' 进行查看。

2. 静态库

2.1. 静态库的制作

直接步入正题了,演示一波 静态库的制作流程。

  • 1 . 我们新建一个工程 如下图所示。选取 Static Library

静态库工程创建.png

  • 2 . 选择自己想取的工程名

工程预览.png

Xcode13以上创建没有Products目录,不要着急

  • 3 . 显示 Products目录
    • 1 . 显示包内容,找到工程文件 工程文件.png
    • 2 . 更改 productRefGroupmainGroup 的值 productref.png
    • 3 . 重新打开工程
    products显示.png

    这个时候Products目录 就出现了

  • 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

编译设置.png

编译设置2.png

  • 6 . 编译生成.a库头文件.h

生成.a.png

  • 7 . 把 生成.a库头文件.h 放到一个新建文件夹中, 其他工程就可以引用使用了

工程调用.png

2.2. 静态库联调

简单的静态库已经制作完成了,但是我们有时候要对静态库联调实时修改工程,不能每次都要编译添加,这个时候就需要关联工程了.

  • 1 . 我们首先将静态库工程,拖入到调试工程

拖入1.png

拖入2.png

  • 2 . 我们关闭静态库工程重新打开调试工程

工程加入.png

  • 3 . 我们在把 原先的库移除 并把 静态库工程 的库加入

移除.png

原先的库移除

加入.png

静态库工程 的库加入

  • 4 . 好了,这个时候就可以联调了,可以修改代码了。

注:.framework 静态库制作流程差不多的(需要在build setting 中的macho type 设置成Static Library)。这里就不多说了。

3. 总结

  • 1 . 静态库已经说的差不多了,动态库其实我们很少制作,不过制作方式都一样的。

  • 2 . 对于研究过编译、链接、启动的兄弟们可能也比较了解动态库静态库的区别了。无非就是macho的链接方式

  • 3 . 大多数公司都会要求制作静态库,毕竟苹果对动态库有要求。

  • 4 . 好了,就到这了,希望这篇博客可以帮助下兄弟们