iOS区分静态库和动态库

在其它大部分平台上,动态库都可以用于不同应用间共享, 共享可执行文件,这就大大节省了内存。
iOS平台 在 iOS8 之前,苹果不允许第三方框架使用动态方式加载,从 iOS8 开始允许开发者有条件地创建和使用动态框架,这种框架叫做 Cocoa Touch Framework。虽然同样是动态框架,但是和系统 framework 不同,app 中使用 Cocoa Touch Framework 制作的动态库 在打包和提交 app 时会被放到 app main bundle 的根目录 中,运行在沙盒里,而不是系统中。也就是说,不同的 app 就算使用了同样的 framework,但还是会有多份的框架被分别签名,打包和加载。不过 iOS8 上开放了 App Extension 功能,可以为一个应用创建插件,这样主app和插件之间共享动态库还是可行的。
苹果系统专属的framework 是共享的(如UIKit), 但是我们自己使用 Cocoa Touch Framework 制作的动态库是放到 app bundle 中,运行在沙盒中的

iOS区分静态库和动态库

Linked Frameworks and Libraries

连接一个库(动态库 或 静态库)

如果连接的是一个静态库

比如libFoo.a,linker的方式会把这个静态库复制到你最终输出的二进制文件里面去,你不需要在运行时解决任何依赖关系的问题。

如果连接的是一个动态库

比如.dylib或者系统的framework(framework跟动态库很像,只不过还包含一些资源文件)。

运行程序时,会认为这个库是默认就在系统里或者你工程的某个位置的,用到的库会在运行时加载进来。

这样做的好处是,比如加载的是系统的framework,那么大家的程序在打包生成二进制时都不需要包含这个framework,因为这个framework是系统提供的。

同样,自己程序包含的动态库,当你的程序有一些相关的扩展程序时,也可以直接使用动态库,而不需要把动态库包含到扩展程序的bundle里面。

Embedded Binaries

Embed是把这个库嵌入到最终输出的程序的bundle里面。

如果连接的是第三方的动态库(比如从github上下载的,或者自己生成的),你就需要对这个库进行embed,然后在进行link。

这样,在运行时,就会寻找你的程序的bundle,找到这个库并加载进来。

区别

Link 后,写代码时,可以导入库的头文件、资源啥的,但是如果没有 Embed,在 App 实际运行时,会找不到这些文件和资源,因为库没有包含到App 的 bundle 里面来。

那还区分 Link 和 Embed 干啥,直接全部用 Embed 不就完了吗?

有的时候我们是只需要 Link 而不需要 Embed 的,比如一个 Framework 依赖另外一个 Framework 的时候(Apple 并不提倡这种操作),比如 Framework A 依赖 Framework B,主工程依赖 Framework A,这时在 Framework A 中,只要 Link Framework B,不需要也不能( Xcode 对于 Framework 工程没有对应的操作界面) Embed Framework B,主工程中在同时 Embed Framework A 和 Framework B。

具体可以看 Embedding Frameworks In An App 的 Apps with Dependencies Between Frameworks 片段

项目中通过查找:

Build Settings -> Mach-O Type

前面提到过,静态库一般是.a文件,动态库一般是.framework文件。为什么说一般,因为静态库也可能没有后缀;.framework文件其实只是个文件夹,真正的二进制文件在.framework里面。.framework里面的二进制文件也可能是静态库,也有可能是动态库。有后缀也可能没有后缀。因此有时候不通过工具很难区分。所以这里推荐一款Mach-O格式文件浏览器:MachOView。

MachOView下载地址:http://sourceforge.net/projects/machoview/
MachOView源码地址:https://github.com/gdbinit/MachOView

CocoaPods 中用 use_frameworks!

在使用CocoaPods的时候在Podfile里加入use_frameworks! ,那么你在编译的时候就会默认帮你生成动态库,我们能看到每个源码Pod都会在Pods工程下面生成一个对应的动态库Framework的target,我们能在这个target的 Build Settings -> Mach-O Type 看到默认设置是 Dynamic Library。也就是会生成一个动态Framework,我们能在Products下面看到每一个Pod对应生成的动态库。

这些生成的动态库将链接到主项目给主工程使用,但是我们上面说过动态库需要在主工程target的 General -> Embedded Binaries 中添加才能使用,而我们并没有在Embedded Binaries中看到这些动态库。那这是怎么回事呢,其实是cocoapods已经执行了脚本把这些动态库嵌入到了.app的Framework目录下,相当于在Embedded Binaries加入了这些动态库。我们能在主工程target的Build Phase -> Embed Pods Frameworks里看到执行的脚本。

所以Pod默认是生成动态库,然后嵌入到.app下面的Framework文件夹里。我们去Pods工程的target里把 Build Settings -> Mach-O Type 设置为Static Library。那么生成的就是静态库,但是cocoapods也会把它嵌入到.app的Framework目录下,而因为它是静态库,所以会报错:unrecognized selector sent to instanceunrecognized selector sent to instance

lipo命令的用法

lipo -info xxxx.framework/xxxx或/xxxx.a
查看信息,支持的cpu架构列表

lipo -create xxxx xxxx -output xxxx
整合成Fat文件

lipo xxxx -thin cpu(armv7/arm64等) -output xxxx
提取特定的cpu架构的thin文件

lipo -remove cpu(armv7/arm64等) xxxx -output xxxx
移除掉特定的cpu架构的文件

参考连接

Embedded Binaries 和 Linked Frameworks and Libraries的区别

https://www.jianshu.com/p/42891fb90304
https://www.jianshu.com/p/71c75c287d26
https://www.jianshu.com/p/c2ee22b68593

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