开发中大家都会使用或多或少的第三方sdk,这些sdk基本都是一个.a文件和若干.h文件组成。.a文件就是ios的静态库,还有一种是.framework/.dylib的动态库。但是自己编写的动态库不能通过审核,所以一般使用的是制作静态库。
新建工程
编写代码
项目会生成一个.h和一个.m初始文件,然后我们编写一个最简单的打印(NSlog)功能的静态库。
#import <Foundation/Foundation.h>
@interface libraryDemo : NSObject
-(void)printA;
+(void)printB;
@end
#import "libraryDemo.h"
@implementation libraryDemo
-(void)printA
{
NSLog(@"PrintA");
}
+(void)printB
{
NSLog(@"printB");
}
@end
编译
接下来就行编译,cmd+b或者product中build都行。注意这里要进行两次,一次是以真机或者ios device进行编译,一次以模拟器进行编译(先以真机或ios device编译)。因为模拟器和真机的运行不一样,编译成功后,products文件夹下的.a文件会变为正常颜色。show in finder后,可以看到两个文件夹,如图
合并静态库(.a文件)
刚才生成了两个文件夹,我们自己制作的sdk不可能让别人分两个环境去使用,所以我们需要合并两个.a文件。
命令为:
lipo -create /yourpath1/lib.a /yourpath2/lib.a -output lib.a
可以用 lipo -info lib.a来查看生成的静态库是支持哪个环境,armv7 arm64 armv7s(根据architectures的valid architecture来生成)的为真机环境,为i386(iPhone4s) x86_64(5s及以上)的话为模拟器。最后合并成功的是两这都有的。在某些情况下生成的静态库会导致build报错,使用不同的模拟器生成.a库,必要的时候还需修改build settings 里的architectures的属性,然后再生成进行合并。
使用静态库
新建一个普通项目,把.h和合并后的.a文件加入工程中,然后
#import "libraryDemo.h"
- (void)viewDidLoad
{
[super viewDidLoad];
[libraryDemo printB];
libraryDemo *testDemo = [[libraryDemo alloc]init];
[testDemo printA];
}
运行程序就可以在控制台看见 printB与printA了。
到此为止,就完成了一个最简单的ios静态库的制作。
望指正与补充~