對於“靜態庫”和“動態庫”的理解總結
通常,我們的 Xcode 工程會依賴一些第三方庫,包括:.a 靜態庫(Static Library)和 .framework 動態庫(Dynamic Library)。
不過簡單地把 .framework 字尾的檔案稱為“動態庫”並不嚴謹,因為在 iOS/macOS 開發中,framework 又分為靜態 framework 和動態 framework ,區別如下:
-
靜態 framework
:可以理解為是.a 靜態檔案
+.h 公共標頭檔案
+資原始檔
的集合,本質上與 .a 靜態庫是一致的; -
動態 framework
:即真正意義上的動態庫,一般包括動態二進位制檔案、標頭檔案和資原始檔等。
對於一個 Static Library 工程,其編譯產物為 .a 靜態二進位制檔案 + 公共 .h 標頭檔案;
對於一個 Framework 工程,其編譯的最終產物是動態庫還是靜態庫,我們可以通過在 Build Settings -> Linking -> Mach-O Type 中進行選擇設定其值為Dynamic Library
或者Static Library
。
此外,我們知道,對於一個 Mach-O 二進位制檔案,不管是 static 還是 dynamic,一般都包含了幾種不同的處理器架構(Architectures),例如:i386, x86_64, armv7, armv7s, arm64 等。
Xcode 在編譯連結時,對於靜態庫和動態庫的處理方式是不同的。
對於靜態庫,在連結時(Linking Time),Xcode 會自動篩選出靜態庫中的不同 architecture 合併到對應處理器架構的主可執行二進位制檔案中;而在打包歸檔(Archive)時,Xcode 會自動忽略掉靜態庫中未用到的 architecture,例如會移除掉 i386, x86_64 等 Mac 上模擬器專用的架構。
而對於動態庫,在編譯打包時,Xcode 會直接拷貝 整個動態 framework 檔案到最終的 .ipa 包中,只有在 App 真正啟動執行時(Run Time),才會進行動態連結。但是蘋果是不允許最終上傳到 App Store Connect 後臺的 .ipa 檔案包含 i386, x86_64 等模擬器架構的,會報 Invalid 錯誤,所以對於工程中的動態 framework,我們在打 Release 正式包時,一般會通過執行命令或者指令碼的方式移除掉這些 Invalid Architectures。
最後,如何在 Xcode 工程中新增這些靜態/動態庫呢?
對於 “.a 靜態庫” 和 “靜態 framework” ,直接拖拽到工程中,並勾選Copy if needed
選項即可,無需其他設定;而對於新增“動態 framework”,稍微比較麻煩,我們將在下一條小集介紹幾種不同的方法。
以上,希望對你能有所幫助,不足之處,歡迎指出。