一、前言
這篇主要是記錄一下 iOS 下靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的打包流程,以便以后用到時(shí)快速查閱,供自己也供大家學(xué)習(xí)記錄。同時(shí)也簡(jiǎn)述了一下動(dòng)態(tài)庫(kù)與靜態(tài)庫(kù)的區(qū)別。
二、靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)
1、庫(kù)
庫(kù)是寫好的現(xiàn)有的,成熟的,可以復(fù)用的代碼。本質(zhì)上來(lái)說(shuō)庫(kù)是一種可執(zhí)行代碼的二進(jìn)制形式,可以被操作系統(tǒng)載入內(nèi)存執(zhí)行。庫(kù)有兩種:靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)。
2、靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的區(qū)別
(1)靜態(tài)庫(kù)
鏈接時(shí)會(huì)被完整的復(fù)制到可執(zhí)行文件中,被多次使用就有多分拷貝。如下圖,抖音和微信的可執(zhí)行文件加載靜態(tài)庫(kù)時(shí),每個(gè)可執(zhí)行文件鏈接時(shí)都要加載這份靜態(tài)庫(kù)。
(2)動(dòng)態(tài)庫(kù)
系統(tǒng)的動(dòng)態(tài)庫(kù)與我們自己打包的動(dòng)態(tài)庫(kù)還不大一樣,先來(lái)看一下系統(tǒng)的動(dòng)態(tài)庫(kù)。
系統(tǒng)動(dòng)態(tài)庫(kù):
鏈接時(shí)不復(fù)制,程序運(yùn)行時(shí)由系統(tǒng)動(dòng)態(tài)加載到內(nèi)存,系統(tǒng)只加載一次,多個(gè)程序共用,節(jié)省內(nèi)存。
例如下圖:抖音和微信的可執(zhí)行文件加載動(dòng)態(tài)庫(kù)時(shí),內(nèi)存中只有一份動(dòng)態(tài)庫(kù),不用加載到可執(zhí)行文件。

自己打包的動(dòng)態(tài)庫(kù):
自己打包的動(dòng)態(tài)庫(kù),則是在應(yīng)用程序里的,但是與靜態(tài)庫(kù)不同,它不在可執(zhí)行文件中。

三、制作靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)
1、制作靜態(tài)庫(kù)
我們?cè)?iOS 下能創(chuàng)建的靜態(tài)庫(kù)分兩種,分為 .a 和 .framework 兩種。
1、制作 .a 靜態(tài)庫(kù)
(1)創(chuàng)建
首先創(chuàng)建一個(gè)工程,選擇為 Static Library 類型。

(2)編譯
然后我們?cè)?Products 下就可以看到一個(gè) .a 文件,但是現(xiàn)在它還是不存在的,需要我們 command+B 編譯一下,就可以找到它了,由于我們是在模擬器下編譯的,所以它生成在 “Debug-iphonesimulator” 文件夾下。

如果添加了新的 .h 文件,需要在 Phases 中把頭文件加上,此處 FanjiduoStatic.h 是創(chuàng)建工程時(shí)默認(rèn)加進(jìn)去了。

然后它會(huì)自動(dòng)把你的頭文件放到 include 里面

2、制作 .framework 靜態(tài)庫(kù)
(1)首先創(chuàng)建一個(gè)工程,選擇為 Framework 類型。

創(chuàng)建好發(fā)現(xiàn)是 .framework 結(jié)尾了

(2)這里要設(shè)置一下,因?yàn)槟J(rèn)是動(dòng)態(tài)庫(kù),要改為靜態(tài)庫(kù)。Build Settings => Mach-O Type 改為 Static Library:

3、測(cè)試靜態(tài)庫(kù)
(1)編寫測(cè)試類
首先編寫了一個(gè) Student 類,實(shí)現(xiàn)了一個(gè) study 的打印方法,
然后把 Student 類 import 進(jìn)了 FanjiduoFrameworkTest.h 總的頭文件里面。

(2)公開(kāi)頭文件
然后在 build Phases => Headers 中把頭文件公開(kāi),從默認(rèn)的 Project 中拖拽到 Public 中:


然后再編譯一下,就大功告成了。
(3)測(cè)試
建立一個(gè)名為 staticTestDemo 的工程引入 framwork 試一下,發(fā)現(xiàn)可以成功調(diào)用 study 方法!

2、制作動(dòng)態(tài)庫(kù)
(1)制作步驟
動(dòng)態(tài)庫(kù)有很多種,目前像 .tbd .dylib 這種的動(dòng)態(tài)庫(kù)我們無(wú)法打包,只能打包 .framework 格式的動(dòng)態(tài)庫(kù)。
系統(tǒng)默認(rèn)設(shè)置的就是動(dòng)態(tài)類型,然后就是將新添加的頭文件公開(kāi),整個(gè)流程和 .framework 靜態(tài)庫(kù)一樣,這里就不再贅述了。
(2)測(cè)試
創(chuàng)建一個(gè)項(xiàng)目來(lái)測(cè)試一下這個(gè)動(dòng)態(tài)庫(kù),直接拖入工程,引入頭文件,調(diào)用動(dòng)態(tài)庫(kù)中的方法,然后編譯,編譯通過(guò)沒(méi)問(wèn)題。
但是當(dāng)我們運(yùn)行的時(shí)候,會(huì)報(bào)下面的錯(cuò)誤:

其實(shí)這是因?yàn)闆](méi)有將它添加到 Embedded 中,在老板的 Xocde 中,Embedded 是單獨(dú)設(shè)置的,但是不知道從那一版 Xocde 開(kāi)始,Embedded和其他設(shè)置合并在一起了?,F(xiàn)在我們只需要在 "General => Frameworks, Libraries, and Embedded Content" 中,把 "Do Not Embed" 改為 "Embed & Sign" 即可,如下圖:

然后就可以正常運(yùn)行了!
以上就是對(duì)靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的簡(jiǎn)單介紹,還有打包的流程,希望在你需要的時(shí)候可以幫到你!
轉(zhuǎn)載請(qǐng)備注原文出處,不得用于商業(yè)傳播——凡幾多