iOS靜態(tài)庫(kù)與動(dòng)態(tài)庫(kù)的區(qū)別與打包

一、前言

這篇主要是記錄一下 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” 文件夾下。

靜態(tài)庫(kù)最新.png

如果添加了新的 .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 的打印方法,
然后把 Studentimport 進(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è)傳播——凡幾多

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容