編譯器之打包動(dòng)態(tài)/靜態(tài)庫(kù)

一曲横、簡(jiǎn)介

I. 庫(kù)的類型分類

靜態(tài)庫(kù)

  • .a.framework 為文件后綴名
    .a 是一個(gè)二進(jìn)制文件,不能直接拿來(lái)用榨乎,使用時(shí)需要 .a文件 + 頭文件 + 資源文件
    靜態(tài)庫(kù)打包時(shí),只能打包代碼,圖片文件县爬、本地 JSON 文件和 xib 等資源文件無(wú)法打包進(jìn)去
  • 靜態(tài)庫(kù) 連接時(shí) 完整的復(fù)制到可執(zhí)行文件中,多個(gè)文件使用添谊,多份拷貝
  • OC 建議使用靜態(tài)庫(kù)财喳,OC 使用動(dòng)態(tài)庫(kù)審核可能會(huì)不通過(guò)
  • 靜態(tài)庫(kù)無(wú)法再包含其他的 .a 靜態(tài)庫(kù)。只能把源碼放進(jìn)去一起編譯

動(dòng)態(tài)庫(kù)

  • .dylib.framework 為文件后綴名「Xcode7 后 .dylib 變?yōu)?.tbd 文件」
    .framework 文件斩狱,能直接拿來(lái)用耳高。.framework 文件 = 二進(jìn)制文件(.a 文件 + .h 文件) + 資源文件
    .tbd 文件,只是一個(gè)文本文件所踊,其中包含架構(gòu)信息泌枪,以及在真實(shí)運(yùn)行時(shí)候二進(jìn)制所在的位置,以及包含了動(dòng)態(tài)庫(kù)的符號(hào)表還有類的一些信息秕岛,這些信息在編譯階段足夠了碌燕∥笾ぃ「減少了所有設(shè)備 SDK 二進(jìn)制動(dòng)態(tài)庫(kù)的體積」
  • 動(dòng)態(tài)庫(kù) 運(yùn)行時(shí) 動(dòng)態(tài)加載到內(nèi)存,只加載一次修壕,多個(gè)文件公用愈捅,節(jié)省內(nèi)存
  • Swift 只能使用動(dòng)態(tài)庫(kù),不支持靜態(tài)庫(kù)
  • 大部分第三方庫(kù)就是動(dòng)態(tài)庫(kù)慈鸠,可以暴露出來(lái)蓝谨,放在源碼的外部引用使用
  • 動(dòng)態(tài)庫(kù)的特性使得軟件版本實(shí)時(shí)模塊升級(jí)、應(yīng)用插件化青团、etc

II. iOS 設(shè)備的 CPU 架構(gòu)

iOS 庫(kù)的打包譬巫,根據(jù) CPU 架構(gòu)的不同而不同
架構(gòu)不同,不能編譯通過(guò)

模擬器的 CPU 架構(gòu)

  • i386:iPhone 4s ~ 5
  • x86_64:iPhone 5s ~ 7 Plus

真機(jī)的 CPU 架構(gòu)

  • armv6:iPhone壶冒、iPhone 2缕题、iPhone 3G、iPod Touch「第一代」胖腾、iPod Touch「第二代」
  • armv7:iPhone 3Gs烟零、iPhone 4、iPhone 4s咸作、iPad锨阿、iPad 2
  • armv7s:iPhone 5、iPhone 5c 「靜態(tài)庫(kù)只要支持了 armv7记罚,就可以在 armv7s 的架構(gòu)上運(yùn)行」
  • armv64:iPhone 5s墅诡、iPhone 6、iPhone 6 Plus桐智、iPhone 6s末早、iPhone 6s Plus、iPad Air说庭、iPad Air2然磷、iPad mini2、iPad mini3

二刊驴、打包靜態(tài)庫(kù)

I. .a 文件 靜態(tài)庫(kù)打包

  1. 創(chuàng)建靜態(tài)庫(kù)的工程
    創(chuàng)建后執(zhí)行 運(yùn)行 或 編譯 姿搜,都可以生成靜態(tài)庫(kù)「保存在項(xiàng)目的 Products 中」
Paste_Image.png
  1. 通過(guò)在不同架構(gòu)的設(shè)備下 編譯/運(yùn)行 生成支持不同架構(gòu)的靜態(tài)庫(kù)
Paste_Image.png
  1. 在 編譯/運(yùn)行 時(shí),所有項(xiàng)目 都可以設(shè)置是 Debug 還是 Release
Paste_Image.png
  1. 設(shè)置庫(kù)的接口 頭文件
Paste_Image.png
  1. 通過(guò)設(shè)置不僅在當(dāng)前運(yùn)行的 CPU 架構(gòu)上捆憎,適配所有的機(jī)型號(hào)架構(gòu)
    一般 debug = no舅柜,release = yes 為了 debug 的時(shí)候編譯更快「只編譯連接當(dāng)前的 CPU 架構(gòu)所用的包」
    可以控制 測(cè)試版本 和 發(fā)布版本 是否都不僅僅能在真機(jī)上使用
Paste_Image.png

II. .framework 文件 靜態(tài)庫(kù)打包

  1. 前三步和 在 .a 文件 打包方式一致
  2. 設(shè)置庫(kù)的接口 頭文件
Paste_Image.png
  1. 設(shè)置打包的是 靜態(tài)庫(kù),因?yàn)閯?dòng)態(tài)庫(kù)也可以以 framework 的形式存在
    設(shè)為Static Library「這個(gè)默認(rèn)選項(xiàng)是動(dòng)態(tài)的」
Paste_Image.png

III. 使用靜態(tài)庫(kù)

1. 防止項(xiàng)目中的文件和 靜態(tài)庫(kù)的同名文件在運(yùn)行時(shí)會(huì)覆蓋躲惰,只保留一張圖片

  • 把圖片文件單獨(dú)的放在一個(gè) .bundle 文件中「一般 .bundle 的名字和 .a.framework 的名字相同」
  • .bundle 文件制作方法:將文件夾致份,重命名為 XXX.bundle
    同理,其他資源文件也放在一個(gè) .bundle 中

2. 在使用 category 靜態(tài)庫(kù)的工程中础拨,調(diào)用方法時(shí)知举,會(huì)出現(xiàn)找不到該方法的運(yùn)行時(shí)錯(cuò)誤:selector not recognized

原因:

  • Unix 的標(biāo)準(zhǔn)靜態(tài)庫(kù)實(shí)現(xiàn)和 Objective-C 的動(dòng)態(tài)特性之間有一些沖突
  • Objective-C 沒(méi)有為每個(gè)函數(shù)定義鏈接符號(hào)瞬沦,它只為每個(gè)類創(chuàng)建鏈接符號(hào)
  • 當(dāng)在一個(gè)靜態(tài)庫(kù)中使用類別來(lái)擴(kuò)展已有類的時(shí)候,鏈接器不知道如何把類原有的方法和類別中的方法整合起來(lái)

解決辦法:

  • 在使用靜態(tài)庫(kù)的工程中配置 other linkerflags 的值為 -ObjC 如果還崩潰雇锡,在添加 -all_load 「或者 -force_load
  • all_load 作用于所有的庫(kù),而 -force_load 后面必須要指定具體的文件
    這樣僚焦,會(huì)將靜態(tài)庫(kù)中所有和對(duì)象相關(guān)的文件都加載進(jìn)來(lái)
Paste_Image.png

3. 避免暴露過(guò)多的 .h 文件

使用

  • 在靜態(tài)庫(kù)的內(nèi)部創(chuàng)建一個(gè) .h 文件「一般這個(gè).h文件的名字和靜態(tài)庫(kù)的名字相同」
    然后把所有需要暴露出來(lái)的 .h 文件名都集中放在這個(gè) .h 文件中锰提,只需要把這個(gè) .h 暴露出來(lái)
  • 一般這個(gè)總頭文件內(nèi)部引入其他頭文件的格式為
    #import <framework名字/其他頭文件.h>,這是以調(diào)用這個(gè)庫(kù)的項(xiàng)目的角度來(lái)寫(xiě)的

搜索頭文件

  • Header Search Paths
    系統(tǒng)的搜索路徑芳悲,用來(lái)引入項(xiàng)目中沒(méi)有添加的 header 文件
    通過(guò) #import <名稱.h> 來(lái)引入

  • User Header Search Paths
    用戶的搜索路徑立肘,用來(lái)引入項(xiàng)目中的已添加的 header 文件
    通過(guò) #import <名稱.h>#import "名稱.h" 來(lái)引入

  • Always Search User Paths
    Header Search Paths 作為系統(tǒng)級(jí)別路徑一定會(huì)被搜索
    設(shè) Always Search User Paths 為 YES,編譯器會(huì)先搜索 User Header Search Paths 路徑下的目錄
    設(shè) Always Search User Paths 為 NO名扛,編譯器不會(huì)搜索 User Header Search Paths 路徑下的目錄「默認(rèn)」

  • 設(shè)置格式舉例:$(SRCROOT)/項(xiàng)目名稱/AppDelegate.h
    $(SRCROOT) 宏和 $(PROJECT_DIR) 宏都指 xxx.xcodeproj 所在的父目錄谅年,新建項(xiàng)目后的目錄為:

Paste_Image.png
  • Project 的 Building Settings 中得設(shè)置默認(rèn)并不被 Targets 繼承
    只有 Targets 的設(shè)置加入了 $(inherited) 時(shí)才被繼承,添加目錄的時(shí)候?qū)懮?$(inherited) 就表示從 frameworks 里面讀取

  • 設(shè)置查找路徑的參數(shù)
    recursive:遍歷該目錄肮韧,編譯的時(shí)候在找?guī)斓穆窂降臅r(shí)候融蹂,會(huì)遍歷該目錄下的所有子目錄的庫(kù)文件
    non-recursive:不遍歷該目錄「默認(rèn),推薦使用弄企,可減少編譯速度」

4. 拖拽項(xiàng)目/將項(xiàng)目當(dāng)做靜態(tài)庫(kù)處理

  • 給當(dāng)前項(xiàng)目在 Link Binary With Libraries 中添加拖拽項(xiàng)目的 庫(kù)文件
  • 如果當(dāng)前的 Target 需要依賴其他庫(kù)文件超燃,在 Target Dependencies 中添加所需的庫(kù)文件
  • 如果庫(kù)文件在 Link Binary With Libraries 中已經(jīng)添加「必要」,但也可能需要在 Target Dependencies 中再次添加「非必要」
Paste_Image.png

5. 其他

  • 查看靜態(tài)庫(kù)所支持的 CPU 架構(gòu)
    在命令行找到靜態(tài)庫(kù)所在的文件夾拘领,執(zhí)行 lipo -info 靜態(tài)庫(kù)文件名 命令

  • 合并靜態(tài)庫(kù)
    在命令行找到靜態(tài)庫(kù)所在的文件夾意乓,執(zhí)行 lipo -create 靜態(tài)庫(kù)1 靜態(tài)庫(kù)2 -output 新靜態(tài)庫(kù)名稱.a 命令

三、打包動(dòng)態(tài)庫(kù)

1. 制作约素、編譯過(guò)程與靜態(tài)庫(kù)相同

2. 在 Embedded Binaries 中添加動(dòng)態(tài)庫(kù)

Paste_Image.png

3. 合并動(dòng)態(tài)庫(kù)文件

合并動(dòng)態(tài)庫(kù)文件并非合并的是 .framework 文件届良,而是其中的二進(jìn)制代碼文件

4. 動(dòng)態(tài)庫(kù)的使用注意

I. 自定義的 .a 靜態(tài)庫(kù),不可以包含動(dòng)態(tài)庫(kù)

II. 自定義的 .framework 靜態(tài)庫(kù)圣猎,可以包含動(dòng)態(tài)庫(kù)文件

繞過(guò) Xcode 的 UI 界面來(lái)連接動(dòng)態(tài)庫(kù)士葫,步驟如下

  • 項(xiàng)目中不需要引用連接的動(dòng)態(tài)庫(kù)「.tbd 的動(dòng)態(tài)庫(kù)」
  • 通過(guò)格式:-l<library_name> 添加動(dòng)態(tài)庫(kù),例:添加 libiconv.tdb 記為 -liconv
Paste_Image.png

缺陷

  • 雖然自定義的靜態(tài)庫(kù)中已經(jīng)導(dǎo)入了動(dòng)態(tài)庫(kù) X.tbd 样漆,但是为障,當(dāng)自定義的 framework 的靜態(tài)庫(kù)被調(diào)用時(shí),可能需要再次導(dǎo)入動(dòng)態(tài)庫(kù) X.tbd 到當(dāng)前項(xiàng)目中
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末放祟,一起剝皮案震驚了整個(gè)濱河市鳍怨,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌跪妥,老刑警劉巖鞋喇,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異眉撵,居然都是意外死亡侦香,警方通過(guò)查閱死者的電腦和手機(jī)落塑,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)罐韩,“玉大人憾赁,你說(shuō)我怎么就攤上這事∩⒊常” “怎么了龙考?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)矾睦。 經(jīng)常有香客問(wèn)我晦款,道長(zhǎng),這世上最難降的妖魔是什么枚冗? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任缓溅,我火速辦了婚禮,結(jié)果婚禮上赁温,老公的妹妹穿的比我還像新娘坛怪。我一直安慰自己,他們只是感情好束世,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布酝陈。 她就那樣靜靜地躺著,像睡著了一般毁涉。 火紅的嫁衣襯著肌膚如雪沉帮。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,115評(píng)論 1 296
  • 那天贫堰,我揣著相機(jī)與錄音穆壕,去河邊找鬼。 笑死其屏,一個(gè)胖子當(dāng)著我的面吹牛喇勋,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播偎行,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼川背,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了蛤袒?” 一聲冷哼從身側(cè)響起熄云,我...
    開(kāi)封第一講書(shū)人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎妙真,沒(méi)想到半個(gè)月后缴允,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡珍德,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年练般,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了矗漾。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡薄料,死狀恐怖敞贡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情都办,我是刑警寧澤嫡锌,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站琳钉,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏蛛倦。R本人自食惡果不足惜歌懒,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望溯壶。 院中可真熱鬧及皂,春花似錦、人聲如沸且改。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)又跛。三九已至碍拆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間慨蓝,已是汗流浹背感混。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留礼烈,地道東北人弧满。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像此熬,于是被迫代替她去往敵國(guó)和親庭呜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容