iOS中生成静态库的那点事

什么是库?

库就是程序代码的集合, 将N个文件组织起来, 是共享程序代码的一种方式

库的分类?

开源库: 源码是公开的, 可以看到每个实现文件 .m 的实现, 例如 Github 上常用的开源库 AFNetworking, SDWebImage 等.

闭源库: 不公开源码, 是经过编译后的二进制文件, 看不到具体的实现. 闭源库又分为: 静态库 和 动态库

静态库的存在形式?

.a

.framework

动态库的存在形式?

.dylib

.framework

静态库和动态库的区别?

.a 文件肯定是静态库, .dylib 肯定是动态库, .framework 可能是静态库也可能是动态库

静态库在链接时, 会被完整的赋值到可执行文件中, 如果多个APP都使用了同一个静态库, 那么每个APP都会拷贝一份, 缺点是浪费内存, 类似于定义一个基本变量, 使用该基本变量是新复制了一份数据, 而不是原来定义的

动态库不会复制,只有一份, 程序运行时动态加载到内存中, 系统只会加载一次, 多个程序公用一份, 节约了内存. 类似于使用变量的内存地址一样. 使用的是同一个变量

但是项目中如果使用了自己定义的动态库, 苹果是不允许上架的, 在 iOS8 后 苹果开放了动态加载 .dylib 的接口, 用于挂载 .dylib 动态库

静态库的运用场景?

保护自己的核心代码, 如讯飞语音摸索了好多年探索出的结果当然要保存起来, 都公开了公司怎么生存

将MRC的项目打包成静态库, 可以在ARC下直接使用, 不用转换, 如别人使用 MRC 写的开源库, 放到自己的ARC项目中, 需要对每个文件加一个编译参数-fno-objc-arc这样相对来说很麻烦, 将整个工程打包成静态库直接放到项目中即可, 也不用对每个文件添加编译选项

静态库的特点?

.a + .h

.a : 可以看做所有 .m 文件加密后的一个二进制文件

.h : 头文件, 用户暴露可用的接口 (方法)

制作静态库的过程 .a

new -> project -> Cocoa Touch Static Liabrary

编写逻辑代码

Build Phases -> Copy Files 添加要暴露的头文件

Build Setting -> Build Active Architecture only (只构建活跃构架) -> nO

a. 所有模拟器调试版本静态库: 选中模拟器 command + b

b. 真机调试版本静态库: 选中 generic iOS Device , Command + b

c. 真机发布静态库: 选中 generic iOS Device , Edit scheme Run -> Build Configuration -> Release.    command +b

工程文件夹 Produts 下的 .a 文件就是编译得到的静态文件

右键 show finder 查看所有版本的静态库

Debug-iphonesos 调试 真机版本

Debug-iphonesimulator 调试 模拟器版本

Release-iphoneos 发布 真几版本

Release-iphonesimulator 发布 模拟器版本

8 . 如何引入静态库?

直接把 对应静态库 .a  和 暴露的.h 文件 拖入到 目标工程中即可

合并静态库?

lipo -create 模拟器调试.a 模拟器发布.a 真机调试.a 真机发布.a output 通用.a

静态库注意:

自己的静态库给别人用, 一般都是给两个发布版本 (模拟器, 真机), 最好不要合并. 如果给了用户合并版的, 用户无法分解.

关于 lipo 命令

点击查看lipo命令

关于构架:

构架是什么?

CPU 构架 是 CPU 厂商给属于同一系列的 CPU 产品定的一个规范, 主要目的是为了区分不同类型 CPU  的重要指示, 模拟器上的构架和真机上的构架不是一样的, 模拟器和模拟器之间, 真机和真机之间的构架也是不同的, 如果静态库的构架和测试项目对应的模拟器或者真机上的构架不对应就会报错 "Undefined symbols for architecture arm64/i386"

查看静态库对应的构架: lipo -info Xxx.a

静态库都支持哪些构架?

模拟器架构

    iPhone4s ~ 5 : i386

    iPhone5s ~ 7Plus : x86_64

真机架构

    3GS~4s : armv7

    5/5c : armv7s(armv7兼容armv7s)

    5s ~ 6sPlus : arm64

模拟器32位处理器测试需要i386架构,

模拟器64位处理器测试需要x86_64架构,

真机32位处理器需要armv7,或者armv7s架构,

真机64位处理器需要arm64架构。

静态库的制造过程 .framework

new -> project -> Cocoa Touch Framework

Build Settings -> Mach-O Type -> Static Library (默认是 Dynamic Library)

编写逻辑代码

公开头文件 Build Phases -> Headers -> 把Project 中需要暴露的 .h 文件拖到 Public 中

将要公开的所有头文件 引入到 总的头文件 (库名.h) 中,

Build Setting -> Build Active Architecture Only -> NO

同 静态库.a 制作的步骤 5

项目文件夹 Products 下 的 库名.framework 右键 show finder

同 .a 静态库制作的步骤7 得到所有类型版本的framework

将 需要的framework 拖入到目标工程中, 调用静态库的方法

2.动态库 .framework

步骤跟 静态库 .framework 类似, 下面是不同的地方

1. Mach-O type -> Dynamic Library

将生成的动态库 .framework 拖入到目标工程之后

2. General -> Embedded Binaries 中 添加该.framework

3. Linked Frameworks and libraries 中 会默认添加该 .framework

swift framework 动态库 (swift 不支持静态库)

1. File --> project --> Cocoa Touch Framework (选择swift 语言)

创建你需要的 swift 文件. 完成代码逻辑

2. Build Phases --> Headers Public 中添加所有用得到的swift 文件

要注意: 所有要暴露出来的swift 类和方法 都必须用public 修饰

3. Build Settings -> Mach-O type 选择 Dynamic library (swift 语言智能选择动态库)

4. Build Active Architecture Only  设为 NO

5. command + b  编译一遍代码, 如果没有问题的话, 动态库已经生成好了

6. 工程文件夹 Products文件夹中 有个.framework 文件, 选中, 右键 show finder

7. 可以拿到 .framework 文件

8. 把 framework 文件拖入要用到的工程中

9. General --> Embedded Binaries 中加入刚刚拖进去的 framework

10. 当framework 拖入工程后 xcode 会自动给 swift类型的 framework 创建一个文件 (库名-swift.h)

11. 工程中 引入 文件 库名-swift.h 后, 就可以调用所有 framework中暴露出来的 swift 方法.

有时候项目需要在集成C++静态库的基础之上,去用OC进行封装暴露对外的接口,实现iOS中SDK的完成。

在C++编译静态库的过程中,有个bitcode选项要注意,用C++编译静态库的时候,尽量支持bitcode否则,你在链接的时候会出现错误。你需要设置工程中target的Enable Bitcode为NO才可以正常编译。

在程序支持的编译框架中可以在Architectures中选择arm64 /arm64e/armv7...

Xcode设置项之Architectures和Valid Architectures和Build Active Architectures Only参数的选择 应当特别注意

项目中编译c++文件的时候,需要修改项目中任意一个.m文件的后缀为.mm否则编译不通过

项目中的资源文件应该放在bundle文件中,利用oc中的从bundle文件中取资源的方式存取。

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

推荐阅读更多精彩内容

  • 1、通过CocoaPods安装项目名称项目信息 AFNetworking网络请求组件 FMDB本地数据库组件 SD...
    阳明先生_X自主阅读 15,980评论 3 119
  • 一直以来,我们在孩子的耳边,或者耳提面命得最多的是:好好读书。可奇怪的是,我们的家长几乎从来不读书。一个不怎么读...
    陈宁儿童与家庭教育研究院阅读 1,736评论 3 7
  • 放松,让自己尽量放松,豁达一点,正确的做事就行。
    L牧阅读 122评论 0 0
  • 2017年12月31日晚,读书时间到,我是星耀小学三年二班的孙梓航,主动读书第一天,内容《东晋十六国-乱世纷争的时...
    SUNZIHANG梦想成真阅读 148评论 1 1
  • 上午九点召开新学期教师会。我重新布置了教师培训选课注意事项。 下午在家刚洗完衣服,想要休息一下,手机发进来一条“有...
    百合小香阅读 733评论 1 5