iOS创建静态库(Xcode8 )

一、简单介绍

1.1. 什么是库
1.2. 库的分类
1.3. 静态库和动态库

二、创建静态库

2.1. 创建.a 静态库
2.2. 创建.framework 静态库


1.1. 什么是库

库是程序代码的集合,是共享程序代码的一种方式。

1.2. 库的分类

根据源代码的公开情况,库可以分为2种类型:
  (1)开源库
    公开源代码,能看到具体实现
    比如SDWebImage、AFNetworking
  (2)闭源库
    不公开源代码,是经过编译后的二进制文件,看不到具体实现
    主要分为:静态库、动态库

1.3. 静态库和动态库

1.3.1. 静态库和动态库的存在形式:
静态库:.a 和 .framework
动态库:.dylib 和 .framework

1.3.2. 静态库和动态库的区别:
静态库:链接时会被复制到可执行文件,被多次使用就会有多次拷贝。
动态库:链接时不会被复制到可执行文件,程序运行时由系统动态加载到内存,系统只加载一次,多个程序可共用,节省内存。

1.3.3. 补充.a与.framework 的区别:
.a 是一个纯二进制文件,不能直接拿来使用,需要配合头文件、资源文件一起使用。
.framework 中除了有二进制文件之外还有资源文件,可以拿来直接使用。
.framework = 静态库/动态库 + .h + bundle
所以,无论是 .a 静态库还是 .framework 静态库,最终需要的都是:二进制文件 + .h + 其它资源文件。

2.1. 创建.a 静态库

2.1.1. 新建项目,点击iOS — Framework&Library — Cocoa Touch Static Library


1.png
2.png

创建好后,系统自动生成以工程名命名的.h和.m文件(可删除),我们在这个自定义的目录下添加或删除文件,注意目录下Products文件夹有一个.a文件为红色,说明文件并不存在,接下来我们要做的就是把自己写的库文件中所有的.m文件都放入.a文件中私有隐藏起来。


3.png

2.1.2. 选中TARGETS下的库文件名,创建对外暴露的头文件


4.png
5.png

2.1.3 接着就可以把我们写好的代码拖进来了(在这里我把之前默认创建的两个文件删除了)


6.png
补充1:步骤2与步骤3可以对调,这边先执行步骤2的目的是为了步骤3创建文件的时候,Headers 会主动把我们新建的文件加进去,省去我们手动再去添加一次。
补充2:方法名最好加上前缀,特别是 C 的方法,避免与项目冲突。

2.1.4 暴露头文件,将我们需要暴露的头文件从 Project 里面拖到 Public

![7.png](http://upload-images.jianshu.io/upload_images/449463-cdaa4444be27c364.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

2.1.5. 编译设置:
1> 需要把 Bulid Active Architecture Only 设置为 No,Yes 表示只编译选中模拟器设备对应的架构,No则为编译所有模拟器设备支持的CPU架构。


8.png

2> 把编译模式改为Realease

9.png

10.png

3> 选择任意模拟器 Command+B,接着选择真机 Command+B,至此,已经生成我们需要的.a 文件。查看下:

11.png
12.png

2.1.6 合并真机编译生成的.a 与模拟器生成的 .a。
在终端输入以下命令行:

lipo -create  模拟器.a文件的路径 真机.a文件的路径 -output 合并后的文件名
13.png

2.1.7. 使用: 只需将IntreSDK.a和暴露出来的.h头文件导入工程目录下就可供外界使用,这样就很好的保护了自己的实现源代码。

14.png

2.2. 创建.framework 静态库

这里我以 MJRefresh 打包成静态库为例
2.2.1 创建工程,选择Cocoa Touch Framework。


Snip20170121_1.png
Snip20170121_2.png

创建好的工程为我们生成了如下文件,其中与工程同名的.h 文件,我们可以把所有需要导入的头文件都放在这里面。Products 文件夹下的.framework 为红色,说明还未生成。


Snip20170121_4.png

2.2.2 导入 MJRefresh 框架中的所有文件,暴露出来的.h文件默认都在Project下,把他移到Public 下。

Snip20170121_22.png
Snip20170121_5.png

2.2.3 配置工程
1> 将 Build Active Architecture Only 改为 No,原因与生成.a 文件一样


Snip20170121_6.png

2> 将Mach-O Type 改为 Static Library,我们制作的是静态.framework。


Snip20170121_7.png

2.2.4 生成.framework 文件。先将 Run 的模式改为 Realease,分别在模拟器与真机环境下 Command+B 。编译好好原先红色的.framework 已经生成变黑。


![ ![Snip20170121_10.png](http://upload-images.jianshu.io/upload_images/449463-c875a00248c3d5dd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)](http://upload-images.jianshu.io/upload_images/449463-023077392ace4ed8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

2.2.5 合并模拟器的.framework 与真机环境的.framework。

lipo -create  模拟器MJFramework.framework的MJFramework路径 真机MJFramework.framework的MJFramework路径 -output 合并后的文件名
Snip20170121_12.png
Snip20170121_18.png
2.2.6 拷贝 Realease-iphoneos 文件夹下的 MJFramework.framework 至桌面,将我们刚刚合并出来的 MJFramework 替换MJFramework.framework 里的MJFramework。

2.2.7. 好了,制作完成,检查下该 .framework 是否同时支持真机与模拟器的处理器架构。

lipo -info MJFramework
Snip20170121_21.png

说明:

模拟器:iphone4s~5 : i386
iphone5s~6plus : x86_64

真机:iphone3gs~4s : armv7
iphone5~5c : armv7s (静态库只要支持了armv7,就可以跑在armv7s的架构上)
iphone5s~6plus : arm64

armv6, armv7, armv7s是ARM CPU的不同指令集,原则是向下兼容的。例如iPhone4S CPU支持armv7, 但它同时兼容armv6,只是使用armv6指令可能无法充分发挥它的特性。

2.2.8. 将刚制作好的.Framework 导入到自己的项目中,就可以使用了。


Snip20170121_25.png

发现如上问题(找不到该方法),因为在 MJRefresh 中包含了 Category,解决方法:
在使用静态库的工程中配置Other Linker Flags为-ObjC

Snip20170121_27.png

大功告成!

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

推荐阅读更多精彩内容

  • 静态库与动态库的区别 首先来看什么是库,库(Library)说白了就是一段编译好的二进制代码,加上头文件就可以供别...
    吃瓜群众呀阅读 11,826评论 3 42
  • 这几天公司有一个新的需求,就是要将我们开发的某些东西都抽取出来,打个比方我们开发了A项目,可以以后B项目要包含A项...
    黄鱼儿啦啦啦阅读 6,115评论 2 16
  • 介绍 动态库形式:.dylib和.framework 静态库形式:.a和.framework 动态库和静态库的区别...
    齐滇大圣阅读 46,030评论 18 252
  • 仅以方便自己查阅记录前言1.静态库和动态库有什么异同?静态库:链接时完整地拷贝至可执行文件中,被多次使用就有多份冗...
    190CM阅读 4,138评论 0 4
  • 回忆这种东西真奇妙,它无声又无息,悄悄的就来了。有的回忆是美好的,有的回忆是痛苦的。而我们要放弃的是那些痛苦。...
    金勇的小屋阅读 169评论 0 0