ios靜態庫和動態庫
靜態庫:以.a 和 .framework為檔案字尾名。
動態庫:以.tbd(之前叫.dylib) 和 .framework 為檔案字尾名。
靜態庫與動態庫的區別
靜態庫:連結時會被完整的複製到可執行檔案中,被多次使用就有多份拷貝;也就是兩個應用程式如果使用同一個靜態庫那麼這兩個應用程式會載入兩次靜態庫。
動態庫:連結時不復制,程式執行時由系統動態載入到記憶體,系統只載入一次,多個程式共用(如系統的UIKit.framework等),節省記憶體。
但是蘋果不讓使用自己的動態庫,否則稽核就無法通過。
.a靜態庫的製作:
1、先建立一個新的Xcode工程Test,需要選擇下面這個模板:

建立完成後是這個樣子的:

2、我們把預設生成的Test.h和Test.m刪掉,重新建立一個類PrintString,在這個類裡面新增一個單純列印字串的簡單方法:


3、選擇新增公開標頭檔案
為了讓使用者知道有哪些方法可以用,我們需要公開標頭檔案,這裡我們公開PrintString.h:

4、修改配置
我們需要把Build Active Architecture Only修改為NO,否則生成的靜態庫就只支援當前選擇裝置的架構。

5、然後編譯
我們分別選擇Generic iOS Device和任意一個模擬器各編譯一次,編譯完後,我們會看到工程中Products資料夾下的libTest.a由紅色變成了黑色,然後show in finder,看看生成的檔案:

我們看到它為真機和模擬器都生成了.a靜態庫。裡面都包含我們選擇公開的標頭檔案。
我們來看看靜態庫支援的框架:命令為lipo -info 靜態庫名字

我們看到,Debug-iphoneos裡面的靜態庫支援的架構有armv7和arm64所以它只能用於真機,在模擬器上會報錯。Debug-iphonesimulator裡面的靜態庫支援的架構有i386和x86_64,所以它只能用於模擬器,在真機上會報錯。
如果想要讓模擬器和真機通用一個靜態庫,我們可以使用終端命令來實現。命令格式:lipo -create 第一個.a檔案的絕對路徑 第二個.a檔案的絕對路徑 -output 最終的.a檔案路徑:

生成通用靜態庫
我們看到生成了一個新的libTest.a檔案。這個靜態庫就支援所有模擬器和所有真機了。然後我們建立一個資料夾,把.a和標頭檔案都放進去,我們最終需要使用的就是這個資料夾:

注意:為了開發方便,我們可以使用生成的通用靜態庫,但是最終上線的使用我們可以只匯入真機的,這樣工程的體積也會小一些。
使用生成的.a靜態庫
新建一個工程,將上面的通用靜態庫拖進去,匯入標頭檔案,就可以使用裡面的方法了。經過試驗,我們生成的靜態庫在真機上和模擬器上都能成功列印字串:

.frameworke靜態庫的製作
1、先建立一個新的Xcode工程LibTest,需要選擇下面這個模板:

建立完成後是這個樣子的:

建立完成後我們可以看到,工程本身自帶一個LibTest.h檔案和一個Info.plist檔案。
2、我們建立一個類PrintString,新增一個單純列印字串的簡單方法:


3、選擇新增公開標頭檔案
為了讓使用者知道有哪些方法可以用,我們需要公開標頭檔案,我們需要在 並且將Target->Build Phases->Headers中的Project中要暴露的標頭檔案拖拽到Pulic裡面,這裡我們公開PrintString.h:

注意:暴露出來的標頭檔案中import的其他類也得新增到public中暴露出來。如果不想將import的類暴露出來,那麼在標頭檔案中用@class 然後在對應的.m檔案中再import。
4、設定支援所有架構(和.a製作一樣)
5、修改生成的Mach-O格式,因為動態庫也可以是以framework形式存在,所以需要設定,否則預設打出來的是動態庫。將target->BuildSetting->Mach-o Type設為Static Library(預設為Dynamic Library):

6、編譯
我們分別選擇Generic iOS Device和任意一個模擬器各編譯一次,編譯完後,我們會看到工程中Products資料夾下的LibTest.framework由紅色變成了黑色,然後show in finder,看看生成的檔案:

我們看到它為真機和模擬器都生成了LibTest.framework靜態庫。
我們來檢視靜態庫支援的框架:與上面不同,命令為lipo -info framework下的二進位制檔名字

如果想要讓模擬器和真機通用一個靜態庫,我們可以使用終端命令來實現。合併的命令與上面不同的是:framework靜態庫合併的不是framework,而是framework下的二進位制檔案,命令為:
lipo -create 第一個framework下二進位制檔案的絕對路徑 第二個framework下二進位制檔案的絕對路徑 -output 最終的二進位制檔案路徑:

然後將任何一個framework中的二進位制檔案替換成合並後的二進位制檔案,然後把framework新增到要使用的專案中即可使用。
使用生成的.framework靜態庫
新建一個工程,將靜態庫拖進去,匯入標頭檔案,就可以使用裡面的方法了。經過試驗,我們生成的靜態庫在真機上和模擬器上都能成功列印字串:

注意:
如果靜態庫中有category類,則在使用靜態庫的專案配置中Other Linker Flags需要新增引數-ObjC或者-all_load。
如果建立的framework類中使用了.tbd,則需要在實際專案中匯入.tbd動態庫。
執行除錯靜態庫
如果你是開發靜態庫的人,你會發現上面的方法只是製作靜態庫,並沒有辦法執行看效果和除錯bug,這時候我們可以這樣:
1、新建一個專門用來開發靜態庫的正常工程Test:

新建工程

2、新增一個靜態庫的target

我們看到它生成了幾樣東西:
一個framework的target:在這裡面修改靜態庫的配置們,例如支援的架構、要暴露的標頭檔案們和Mach-O的配置。
一個LibTest資料夾:靜態庫裡面的類們都放在這裡面。
product資料夾下面的LibTest.framework:在這裡show in finder找到編譯後生成的靜態庫。
3、開發除錯程式碼

我們看到程式可以正常執行,並可以在動態庫裡面蹲點執行。方便我們除錯。
4、確保程式碼沒問題後,選擇對應的target編譯生成。

相關文章
- iOS動態庫和靜態庫的運用iOS
- iOS中的動態庫,靜態庫和framework介紹iOSFramework
- cmake:生成靜態庫和動態庫
- 靜態庫與動態庫
- iOS 靜態庫 與私有庫iOS
- android下java的靜態庫和動態庫AndroidJava
- iOS - 靜態庫.a 和 framework 詳解iOSFramework
- 一、靜態庫和動態庫,Makefile專案管理專案管理
- 簡述Linux下的靜態庫和動態庫Linux
- 動靜態庫
- iOS的Framework靜態庫iOSFramework
- Linux共享庫、靜態庫、動態庫詳解Linux
- Android NDK祕籍--淺析靜態庫和動態庫Android
- linux下的靜態庫與動態庫Linux
- [Linux]動靜態庫Linux
- linux 動態庫 靜態庫 函式覆蓋Linux函式
- 動態連結庫與靜態連結庫
- iOS中動/靜態庫支援bitcode的問題iOS
- 筆記: 判斷lib庫是動態庫還是靜態庫筆記
- iOS 靜態庫詳解與開發iOS
- 自建 iOS 靜態庫並用 pod 管理iOS
- 靜態庫和動態庫的製作以及Bundle資原始檔的使用
- iOS動態庫的使用iOS
- CMake和靜態庫順序
- 靜態庫生成
- linux下靜態連結庫和動態連結庫的區別有哪些Linux
- Android NDK祕籍--編譯靜態庫、呼叫靜態庫Android編譯
- 關於MNN工程框架編譯出來的靜態庫和動態庫的使用框架編譯
- Android:JNI與NDK(二)交叉編譯與動態庫,靜態庫Android編譯
- 偽靜態、靜態和動態的區別
- C靜態庫的建立與使用--為什麼要引入靜態庫?
- 封裝動態庫dll與靜態庫lib(原理及簡單例項)封裝單例
- 靜態資源公共庫
- 深入iOS系統底層之靜態庫介紹iOS
- iOS應用程式瘦身的靜態庫解決方案iOS
- iOS-靜態庫聯調中的若干問題iOS
- 靜態路由和動態路由路由
- 靜態代理和動態代理