Objective C 打包靜態庫

2021-09-24 07:14:50 字數 2826 閱讀 8643

objective-c 打包靜態庫

ios庫簡介

ios中的所謂的庫,就是一些封裝好的**的集合,可以用來共享程式**的一種方式。在ios中庫,其實就是一些三方框架,並且這些庫一般都是靜態的,整合自定義動態庫過不了審核。

複製**

ios庫分類

開源

所有**都是公開的,可見的;你可以看到.**件裡的介面,也可以看到.m檔案裡的具體實現。

比如afnetworking、sdwebimage、mjrefresh等等。

複製**

閉源

源**是封閉的,不可見的;只公開呼叫.**件中的呼叫介面,看不到.m檔案中介面的具體實現,是乙個編譯後的二進位制檔案。只暴露.h 檔案。

複製**

動態庫

多個程式使用同乙個動態庫時,每個程式和動態庫鏈結時不會複製,某個程式執行時由系統動態載入到記憶體,供程式呼叫。而且系統只載入一次,多個程式共用庫中的**,節省記憶體。

以".tdb"(xcode7以前為".dylib")或者「.framework」為檔案字尾名。

複製**

靜態庫

多個程式使用同乙個靜態庫時,每個程式和靜態庫鏈結時會被完整的複製到可執行檔案中,被多次使用就有多份拷貝。

以".a"或者「.framework」為檔案字尾名為靜態庫。

複製**

版本

真機-debug版本、真機-release版本、模擬器-debug版本、模擬器-release版本

debug版本含完整的符號資訊,以方便除錯,但是不會對**進行優化;

release版本執行**是進行過優化,大小會比debug版本的略小,執行速度比debug版本快,但是不會包含完整的符號資訊;

一般開發中都打包release版本。

複製**

ios裝置分類

模擬器4s-5: i386 針對intel通用微處理器32位處理器

5s-8 plus: x86_64 是針對x86架構的64位處理器

真機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 (靜態庫只要支援了armv7,就可以在armv7s的架構上執行)

arm64 : iphone 5s、iphone 6、iphone 6 plus、iphone 6s、iphone 6s plus、iphone 7、iphone 7 plus、iphone 7s、iphone 7s plus、iphone se、iphone 8、iphone 8 plus、iphone x、ipad air、ipad air2、ipad mini2、ipad mini3、ipad pro

靜態庫中的內容

** + 資源

**檔案

oc類的.h和.m檔案、category檔案、c、c++等

資源檔案

**檔案需要呼叫的資源,如、xib檔案、plist檔案等

注意事項

除oc類的.h和.m**檔案檔案外,還有 category 、 c 、 c++ ,在匯入該靜態庫時需要在 xcode -> build settings -> other linker flags 進行特殊設定

other linker flags說明

-objc

unix的標準靜態庫實現和objective-c的動態特性之間有一些衝突:objective-c沒有為每個函式(或者方法)定義鏈結符號,它只為每個類建立鏈結符號。

這樣當在乙個靜態庫中使用分類來擴充套件已有類的時候,鏈結器不知道如何把類原有的方法和分類中的方法進行關聯,就會導致你呼叫分類中的方法時,出現」selector not recognized」,也就是找不到方法定義的錯誤。

為了解決這個問題,引入了-objc標誌,它的作用就是 將靜態庫中所有的和物件相關的檔案都載入進來 。

複製**

-all_load

可以強制載入所有的category、c、c++。該標記值是專門處理-objc的乙個bug的。用了-objc以後,如果類庫中只有category沒有類的時候這些category還是載入不進來。

複製**

-force_load

可以強制載入所有的category、c、c++,但是-force_load後面必須跟乙個指向該.a檔案的靜態庫路徑。

複製**

總結

複製**

打包靜態庫

打包 category 靜態庫

建立工程

刪除工程裡的檔案

新增包內容

更改使用版本

適配架構 ★★

新增庫鏈結標識 ★★

新增公開檔案(暴露標頭檔案)

8. 改變 scheme

生成 .a(release - 真機)

裝置選擇 generic ios device,command + b 進行編譯

找到 .a 路徑

生成 .a (release - 模擬器)

隨便選乙個裝置,command + b 編譯;然後一樣找到檔案

合併 .a 檔案

$ lipo -create 模擬器release.a 真機release.a -output 全路徑/輸出sdk.a

複製**

使用 sdk

打包靜態庫

參考 1 首先生成模擬器下地.a靜態庫,通過命令lipo info libtest.a 可知其architectures in the fat file libtest.a are i386 x86 64 2 再生成device 真機 環境下地.a靜態庫,通過命令lipo info libtest....

打包靜態庫,合併靜態庫

ios靜態庫 a 和framework 合併靜態庫 1,開啟終端,輸入lipo create release iphoneos libsbjson.a release iphonesimulator libsbjson.a output combine libsbjson.a 其中release i...

手動打包 a靜態庫

1.新建.a靜態庫工程 2.實現需要打包的類 3.編譯靜態庫 沒有編譯時是紅色,編譯成功後為黑色 當你選擇編譯器為模擬器時,編譯出來的就是模擬器版本.a靜態庫 當你選擇編譯器為裝置時,編譯出來的就是真機版本.a靜態庫 這時候就可以分別適配真機或者模擬器靜態庫了 但是為了方便我們通常會將兩個版本綜合到...