ios打包靜態庫

 

 

一、 什麼是庫?ios

所謂庫就是程序代碼的集合,是共享程序代碼的一種方式。架構

二、 庫的分類框架

根據程序代碼的開源狀況,庫能夠分爲兩類iphone

  • 開源庫
    源代碼是公開的,你能夠看到具體實現。好比GitHub上比較出名的第三方框架AFNetworking、SDWebImage。
  • 閉源庫
    不公開源代碼,只公開調用的接口,看不到具體的實現,是一個編譯後的二進制文件。這種常見於一些公司的SDK包,好比高德地圖SDK、環信即時通信SDK等等。而閉源庫又分爲兩類:靜態庫和動態庫。本篇重點要講的即是其中的靜態庫。

三、靜態庫和動態庫的存在形式和使用區別工具

存在形式:測試

  • 靜態庫
    以".a"或者「.framework」爲文件後綴名
  • 動態庫
    以".dylib"或者「.framework」爲文件後綴名

使用區別:ui

  • 靜態庫連接時會被完整的複製到可執行文件中,被屢次使用就有多份拷貝。
 
靜態庫被程序使用時
  • 動態庫連接時不復制,程序運行時由系統動態加載到內存,供程序調用。並且系統只加載一次,多個程序共用,節省內存。
 
動態庫被程序使用時

四、iOS 設備的CPU架構3d

  • 模擬器:
    4s-5: i386
    5s-7 Plus: x86_64日誌

  • 真機(iOS設備):
    armv6: iPhone、iPhone 二、iPhone 3G、iPod Touch(第一代)、iPod Touch(第二代)
    armv7: iPhone 3Gs、iPhone 四、iPhone 4s、iPad、iPad 2
    armv7s: iPhone 五、iPhone 5c (靜態庫只要支持了armv7,就能夠在armv7s的架構上運行)
    arm64: iPhone 5s、iPhone 六、iPhone 6 Plus、iPhone 6s、iPhone 6s Plus、iPad Air、iPad Air二、iPad mini二、iPad mini3code

注:真機iPhone七、iPhone7 Plus A10處理器究竟是什麼架構暫時不得而知,沒查到相關資料,貌似還沒公佈,可是模擬器是x86_64。

3、打包靜態庫

由於靜態庫存在兩種形式,咱們先看.a靜態庫的打包

  • .a文件靜態庫打包

一、打開Xcode建立一個新的工程,這裏以Xcode8爲例,選擇工程以下:

 
建立一個新的工程

二、建立工程完畢後,再建立一個工具類StaticLibTool,添加一個方法用於測試


 
建立一個工具類,添加測試方法

StaticLibTool.m文件實現以下

 
taticLibTool.m文件實現

三、運行工程進行打包

 
運行工程打包

運行完畢後,咱們會看到工程中Products文件夾下的libStaticLib.a文件由紅色變成了黑色。右鍵show in finder能夠在其目錄下找到它。這就是咱們打包好的.a靜態文件了。

 
打包好的.a靜態文件

可是這樣就完了嗎?固然沒有,咱們知道靜態庫存在的最大意義是隱藏代碼的具體實現,可是這也隱藏的太完全了,總要公開些接口或者頭文件供人調用吧。

四、公開接口頭文件

targets->Build Phases->Copy Files->"+"你須要公開的頭文件

這裏咱們把新建的測試類StaticLibTool.h公開


 
公開接口頭文件

公開頭文件後,咱們再按上述一、二、3流程從新運行打包,咱們會獲得一個頭文件和一個.a靜態庫(以下圖),而這正是咱們所須要的。

 
從新運行打包

五、新建一個可運行的工程,把這兩個打包好的文件拖入項目測試

 
測試

選擇Iphone7模擬器運行,程序正常運行,點擊模擬器屏幕,打印日誌以下:

 
日誌輸出

咱們能夠看到輸出沒有問題,打包.a靜態庫大功告成。

可是,別高興的太早。當我把模擬器切換成Iphone5運行時,編譯直接不經過,報錯以下:

 
iPhone 5模擬器運行時的編譯錯誤

上圖「Undefined symbols for architecture i386」是什麼意思呢?意思是咱們的libStaticLib.a靜態庫不支持i386架構。那i386又是什麼鬼?不清楚的能夠拉上去看「iOS 設備的CPU架構」,這裏就很少作解釋了。

iPhone 5模擬器正好是i386架構,而咱們打包的靜態庫不支持。可是iPhone 7模擬器運行卻沒有問題,這說明咱們打包的靜態庫正好支持iPhone 7模擬器 的cpu架構 x86_64。如何查看靜態庫所支持的架構,請看下一步。

六、終端查看靜態庫所支持的架構

終端->cd進入庫文件路徑->lipo -info 庫名


 
終端查看靜態庫所支持的架構

上圖能夠看到,咱們的靜態庫僅支持x86_64架構,也就是說此靜態庫只可運行在iphone5s-iphone7plus之間的模擬器設備。因此剛纔咱們運行iphone5模擬器時,編譯會報錯。

到這裏就能夠進一步解釋下,打包靜態庫時,你用什麼模擬器運行,打包出來的靜態庫就支持什麼模擬器的架構,而剛纔我打包時是用iPhone7運行,因此僅支持架構x86_64。那麼這就太麻煩了,能夠打包一個靜態庫支持多種架構的模擬器嗎?答案是確定的,請看下一步。

七、設置適配全部模擬器架構

project -> buildSeting -> Build Active Architecture Only 設爲NO

 
設置適配全部模擬器架構

設置完成後,咱們從新運行打包靜態庫文件(這時你可隨便選一個模擬器),按照上述第6步終端查看其支持的架構,咱們能夠看到終端輸出的結果是同時支持 i386和x86_64,這也就意味着同時支持全部模擬器。

到這裏打包.a靜態庫已經告一段落,可是按上述流程打包的只能在模擬器上跑,真機是不能運行的,由於ios真機設備跟模擬器的架構又不同(怎麼不同本身拉上去看),因此還沒完(我也不想啊 ),請看下一步

八、打包支持真機架構的靜態庫

全部流程都跟上面的同樣,只是咱們運行打包時要選擇真機運行,以下圖你能夠選擇本身插上去的真機,也能夠選擇Generic ios Devices。固然不要忘記了設置支持全部真機機型架構: Build Active Architecture Only 設爲NO。


 
打包支持真機架構的靜態庫

咱們能夠看下打包出來的終端查看結果以下:

 
終端輸出結果

上圖能夠看到同時支持armv7和arm64,也就是支持全部ios設備。好了到此打包.a靜態庫算是告一段落。

  • .frameworke文件靜態庫打包

一、依然Xcode建立一個新的工程FrameworkeLib,選擇工程以下:

 
建立一個新的工程

建立完成後咱們能夠看到,工程自己自帶一個FrameworkeLib.h文件,這是相似一個主頭文件同樣的東西

 
FrameworkeLib.h文件

二、建立須要測試的類,爲了方便我把上述打包.a的測試類StaticLibTool直接拖來使用。

三、設置支持全部模擬器架構或真機架構(和打包.a第7步驟同樣)

四、公開頭文件

target-Build Phases - Headers -把須要公開的頭文件從project拖入Public

 
暴露頭文件

五、設置打包的是靜態庫。由於動態庫也能夠是以framework形式存在,因此須要設置,不然默認打出來的是動態庫

target->BuildSetting ->搜索關鍵字mach->Mach-o Type 設爲Static Library(這個默認選項是動態的)

 
設置打包的是靜態庫

六、選中真機或模擬器運行設備打包(與打包.a同樣),完成後Products文件夾下的FrameworkeLib.framework文件由紅色變成了黑色,右鍵show in finder 顯示以下:

 
打包結果

FrameworkeLib.framework拖入項目即可直接使用,這裏就再也不進行測試了。此外還要補充的一點是,打包靜態庫的時候還需注意打包的是測試版(Debug)仍是發佈版(Release),這個根據你本身的需求決定,而如何進行設置請下一步驟。

七、設置打包靜態庫的測試版和發佈版(.a和.frameworke)

product -> scheme -> Edit scheme -> Run->選擇Debug或Release

 
相關文章
相關標籤/搜索