创建.framework和静态库.a文件

创建.framework文件#

说明:本次操作使用的是Xcode7.2

1.新建工程,选择Framework

Create a new Xcode project.png
选择Framework.png

2.给工程命名,点击next,选择保存路径

project name.png

3.我们首先看到的Products下的FrameworkDemo.framework是红色,表示还没有相应的framework文件生成

framework_unvalid.png

4.删除默认的FrameworkDemo.h文件

删除默认的.h文件.png

5.删除后就可以创建自己的类来实现相应的功能,比如

功能实现.png

说明:两个类里仅写了示例代码

在GPModel.h里定义了一个方法

@interface GPModel : NSObject

- (void) learn;

@end

实现方法

@implementation GPModel

-(void)learn{
    NSLog(@"正在学习如何创建framework");
}

@end

在GPView.h文件定义了一个方法

@interface GPView : UIView

- (void) createViewFromSuperView:(UIView *) superView;

@end

实现方法

@implementation GPView

-(void)createViewFromSuperView:(UIView *)superView{
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    view.backgroundColor = [UIColor redColor];
    [superView addSubview:view];
}

/*
// Only override drawRect: if you perform custom drawing.
// An empty implementation adversely affects performance during animation.
- (void)drawRect:(CGRect)rect {
    // Drawing code
}
*/

@end

到这里,假设该framework的所有功能都实现完了,下面的操作就很关键了~~

点击项目,选择Build Phases,Headers,默认情况下所有的.h文件都已经添加到Project里面了,但是我们需要做一些调整,有些.h必须放到Public下,这样在外界使用的时候才能调用到相应的接口,不公开的接口文件放在Private下。

接口文件1.png
需要公开的接口文件.png

处理好之后就可以做一下编译之前的准备工作了

1.选择运行环境,模拟器或者真机,这个应该都知道怎么选择吧 这里不在累述了,先选择模拟器

2.选择Edit Scheme

Edit Scheme_simulator.png

3.选择Run,Debug模式,点击close

RunAndDebug.png

4.编译一下,到这里,在模拟器下运行的framework已经生成了,但是此时你看到的Product下的.framework文件还是红色的,这是正常的。甭管它

切换到真机状态下

1.选择真机或者iOS Device

iPhone.png

2.选择Edit Scheme

Edit Scheme_iPhone.png

3.选择Run,Release模式, 点击close

RunAndRelease.png

4.编译,到这里,在真机上运行的framework文件就生成好了,此时看到的product下的.framework文件已经变成黑色了

framework_valid.png

点击Products下的FrameworkDemo.framework文件,右键,选择show in Finder,可以看到该文件所在位置

show in Finder.png

在这儿可以看到有两个文件夹,分别对应模拟器和真机,选中任意一种状态下的FrameworkDemo.framework文件,可以看到该framework文件里面包含的文件

framework——included.png

红色框选中的为二进制文件。后面会用到

到这里就可以创建一个测试工程来测试创建的framework是否可用了,但是现在使用的话模拟器和真机是分开的,也就是前面两个文件夹下的framework文件只能在对应的环境下使用。可以通过终端看一下使用环境,首先切换到该目录下,然后使用 lipo -info 命令。

模拟器文件下的framework

模拟器运行环境.png

真机文件夹下的framework

真机运行环境.png

为了统一使用,可以将两种状态下的framework文件合并成一个,这样在使用的时候就不用区分了。还是用使用终端来实现这一强大的转变。使用lipo -create XXX XXX -output FrameworkDemo命令。

说明:两个XXX分别表示模拟器和真机两个文件下的FrameworkDemo.framework里面的二进制文件FrameworkDemo,output FrameworkDemo中的FrameworkDemo指的是合并之后的二进制文件

合并.png

最后通过ls可以看到多了一个FrameworkDemo文件

使用前的准备
在模拟器或者真机文件夹里把 FrameworkDemo.framework文件复制一份放到桌面上(随便你放在哪儿都一样哈),然后把合并之后生成的二进制文件替换调FrameworkDemo.framework里面的二进制文件。这样一个完整的framework文件就制作完成了,耶耶~

激动人心的时刻到了,创建一个测试工程test,把桌面上的FrameworkDemo.framework放到测试项目中,可以清晰地看到里面的.h文件提供了哪些接口。

scan.png

导入头文件

#import <FrameworkDemo/GPModel.h>
#import <FrameworkDemo/GPView.h>

测试代码

- (void)viewDidLoad {
    [super viewDidLoad];

    GPModel *model = [[GPModel alloc] init];
    [model learn];
    
    GPView *view = [[GPView alloc] init];
    [view createViewFromSuperView:self.view];
}

点击运行,此刻程序崩了,他娘的~ 气死人了吧
![Error info.png](./Error info.png)

别着急,会有解决办法的~
点击项目,General,在Embedded Binaries添加Framework

add Framework.png

添加之后在Linked Frameworks and Libraries里面会看到两个相同的文件,删掉一个吧

Delete Framework.png

然后在运行一下,就可以看到你想要的结果了

模拟器运行结果.png

真机运行会出同样的结果哈,试试吧

结果出来了,恭喜你~~

创建静态库.a文件#

打开Xcode,选择Framework&Library,选择Cocoa Touch Static Library,点击Next

choose staticLibrary.png

给静态库文件命名(staticLibDemo),点击Next,选择保存路径...

name.png

在项目的左侧,我们看到Products文件夹里的libstaticLibDemo.a文件是红色的,说明该文件是不存在的,所以...

a_ notExist.png

删除默认的.h和.m文件

delete default.png

创建自己的类来实现该.a文件的功能

my class.png

在GPModel.h里定义了一个方法

@interface GPModel : NSObject

- (void) learn;

@end

实现方法

@implementation GPModel

-(void)learn{
    NSLog(@"正在学习创建静态库.a文件");
}

@end

在GPView.h文件定义了一个方法

@interface GPView : UIView

- (void) createViewFromSuperView:(UIView *) superView;

@end

实现方法

@implementation GPView

-(void)createViewFromSuperView:(UIView *)superView{
    UIView *view = [[UIView alloc] initWithFrame:CGRectMake(100, 100, 100, 100)];
    view.backgroundColor = [UIColor redColor];
    [superView addSubview:view];
}

@end

到这里,假设该静态库.a文件的所有功能都实现完了,下面将介绍如何生成.a文件。
首先选中项目名称,Build Phases,点击加号+,选择 New Headers Phase

add New Headers.png

此刻发现Headers里面empty

headers_empty.png

点击下方的加号+,选中所有.h文件,点击Add

add_h.png

添加之后发现.h文件全部都在Project里面,所以在这里我们做一些调整,将需要公开接口的.h文件移动到Public,不公开的可以移动到Private

headers_Project.png
headers_Public.png

现在进行编译,通常只需要设置模拟器和真机,但是在这里需要提醒一下,在编译之前先进行一项设置,这一步非常重要,选中项目,Build Settings, Architectures里面的Build Active Architecture Only里面有Debug和Release两种状态,请都设置成NO,请设置成NO,请设置成NO,重要的事说三遍,(如果是YES的话,假如你选中的是5s进行编译的话,生成的.a文件就只能在5s的模拟器上运行,在其他机型上是跑不起来的~~)

settings.png

选择Edit Scheme, Run, Debug, 点击Close,最后编译一下,只要编译成功就可以了,到这里和生成framework是一样的

Edit Scheme_simulator.png
RunandDebug.png

模拟器编译完成后.a文件依然是红色的,和framework一样,不必惊讶

simulator_a.png

选择真机

choose iPhone.png
Edit Scheme_iPhone.png

真机选择 Release !!!

RunandRelease.png

编译成功后.a文件显示黑色,Show in Finder

iPhone_a.png

在文件夹中发现有两个文件夹:模拟器的Debug版和真机的Release版, 到这里就创建好了,而且能使用了,但是还不完整,模拟器上的.a文件不能在真机上运行,同样真机的.a文件不能再模拟器上运行,所以还是和framework一样,把两个.a合并成一个通用的版本。

two_a.png

启动终端,使用lipo -create XXX XXX -output XXX

说明:前面两个XXX分别表示模拟器和真机编译的.a文件,最后一个XXX是指合并后的.a文件

terminal.png

执行完以后发现Products下除了模拟器和真机两个文件夹以外多了一个.a文件,恭喜你,这个.a文件就是通用版本的.a文件,直接把这个.a文件复制一个,比如放在桌面

universal_a.png

.a文件要稍微麻烦一点,除了把这个.a放到项目以外,还要把公开的.h文件一起拷贝出来,可以新建一个文件夹libstaticlibdemo

doucment.png

使用的时候把文件夹libstaticlibdemo放到项目中就可以了。

下面可以新建一个测试工程来测试.a文件的功能
如果出现下面的错误,检测一下前面在编译之前的准备工作是否完善,选中项目,Build Settings, Architectures里面的Build Active Architecture Only里面有Debug和Release两种状态,如果是YES的话就只能选择之前编译时选中的模拟器型号了,改成NO,重新生成吧,自作孽,不可活

error information.png

运行结果:

result.png

恭喜,.a文件创建成功.

.framework和.a文件都Ok了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,980评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,422评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 143,130评论 0 325
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,553评论 1 267
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,408评论 5 358
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,326评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,720评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,373评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,678评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,722评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,486评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,335评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,738评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,009评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,283评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,692评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,893评论 2 335

推荐阅读更多精彩内容