你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> IOS 打包靜態庫詳細引見

IOS 打包靜態庫詳細引見

編輯:IOS開發綜合

IOS 打包靜態庫詳細引見

一、前言

前段時間看的一本書上說:“隔著一段間隔看,很多風趣的知識看起來都很唬人。”比方說這篇我要總結的“靜態庫知識”,在我初出茅廬的時分著實覺得那些後綴名為“.frameworke”、“.a”、“.dylib”的文件很奧秘,很高冷。那時我雖然知道只需導入一個庫就能援用庫外面很多封裝好的東西,但對這個“庫”終究是什麼“鬼”,不斷都是雲裡霧裡。好了廢話不多說,看下去就知道它是個什麼“鬼”。

二 、一些概念的補充

1、 什麼是庫?

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

2、 庫的分類

依據順序代碼的開源狀況,庫可以分為兩類

開源庫

源代碼是地下的,你可以看到詳細完成。比方GitHub上比擬知名的第三方框架A.networking、SDWebImage。

閉源庫

不地下源代碼,只地下調用的接口,看不到詳細的完成,是一個編譯後的二進制文件。這種罕見於一些公司的SDK包,比方高德地圖SDK、環信即時通訊SDK等等。而閉源庫又分為兩類:靜態庫和靜態庫。本篇重點要講的便是其中的靜態庫。

3、靜態庫和靜態庫的存在方式和運用區別

存在方式:

靜態庫

以".a"或許“.framework”為文件後綴名

靜態庫

以".dylib"或許“.framework”為文件後綴名

運用區別:

靜態庫鏈接時會被完好的復制到可執行文件中,被屢次運用就有多份拷貝。


    靜態庫被順序運用時

靜態庫鏈接時不復制,順序運轉時由零碎靜態加載到內存,供順序調用。而且零碎只加載一次,多個順序共用,節省內存。


靜態庫被順序運用時

4、IOS 設備的CPU架構

模仿器:
4s-5: i386
5s-7 Plus: x86_64

真機(IOS設備):
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、iPad Air、iPad Air2、iPad mini2、iPad mini3

注:真機iPhone7、iPhone7 Plus A10處置器究竟是什麼架構暫時不得而知,沒查到相關材料,貌似還沒發布,但是模仿器是x86_64。

三、打包靜態庫

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

.a文件靜態庫打包

1、翻開Xcode創立一個新的工程,這裡以Xcode8為例,選擇工程如下:


  創立一個新的工程

2、創立工程終了後,再創立一個工具類StaticLibTool,添加一個辦法用於測試


    創立一個工具類,添加測試辦法

StaticLibTool.m文件完成如下


taticLibTool.m文件完成

3、運轉工程停止打包


   運轉工程打包

運轉終了後,我們會看到工程中Products文件夾下的libStaticLib.a文件由白色變成了黑色。右鍵show in finder可以在其目錄下找到它。這就是我們打包好的.a靜態文件了。


   打包好的.a靜態文件

但是這樣就完了嗎?當然沒有,我們知道靜態庫存在的最粗心義是隱藏代碼的詳細完成,但是這也隱藏的太徹底了,總要地下些接口或許頭文件供人調用吧。

4、地下接行動文件

targets->Build Phases->Copy Files->"+"你需求地下的頭文件

這裡我們把新建的測試類StaticLibTool.h地下


   地下接行動文件

地下頭文件後,我們再按上述1、2、3流程重新運轉打包,我們會失掉一個頭文件和一個.a靜態庫(如下圖),而這正是我們所需求的。


重新運轉打包

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


    測試

選擇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。如何檢查靜態庫所支持的架構,請看下一步。

6、終端檢查靜態庫所支持的架構

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


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

上圖可以看到,我們的靜態庫僅支持x86_64架構,也就是說此靜態庫只可運轉在iphone5s-iphone7plus之間的模仿器設備。所以方才我們運轉iphone5模仿器時,編譯會報錯。

到這裡就可以進一步解釋下,打包靜態庫時,你用什麼模仿器運轉,打包出來的靜態庫就支持什麼模仿器的架構,而方才我打包時是用iPhone7運轉,所以僅支持架構x86_64。那麼這就太費事了,可以打包一個靜態庫支持多種架構的模仿器嗎?答案是一定的,請看下一步。

7、設置適配一切模仿器架構

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


設置適配一切模仿器架構

設置完成後,我們重新運轉打包靜態庫文件(這時你可隨意選一個模仿器),依照上述第6步終端檢查其支持的架構,我們可以看到終端輸入的後果是同時支持 i386和x86_64,這也就意味著同時支持一切模仿器。

到這裡打包.a靜態庫曾經告一段落,但是按上述流程打包的只能在模仿器上跑,真機是不能運轉的,由於ios真機設備跟模仿器的架構又不一樣(怎樣不一樣自己拉上去看),所以還沒完(我也不想啊 ),請看下一步

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

一切流程都跟下面的一樣,只是我們運轉打包時要選擇真機運轉,如下圖你可以選擇自己插上去的真機,也可以選擇Generic ios Devices。當然不要遺忘了設置支持一切真機機型架構: Build Active Architecture Only 設為NO。


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

我們可以看下打包出來的終端檢查後果如下:


     終端輸入後果

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

.frameworke文件靜態庫打包

1、仍然Xcode創立一個新的工程FrameworkeLib,選擇工程如下:


    創立一個新的工程

創立完成後我們可以看到,工程自身自帶一個FrameworkeLib.h文件,這是相似一個主頭文件一樣的東西


  FrameworkeLib.h文件

2、創立需求測試的類,為了方便我把上述打包.a的測試類StaticLibTool直接拖來運用。

3、設置支持一切模仿器架構或真機架構(和打包.a第7步驟一樣)

4、地下頭文件

target-Build Phases - Headers -把需求地下的頭文件從project拖入Public


暴露頭文件

5、設置打包的是靜態庫。由於靜態庫也可以是以framework方式存在,所以需求設置,否則默許打出來的是靜態庫

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


    設置打包的是靜態庫

6、選中真機或模仿器運轉設備打包(與打包.a一樣),完成後Products文件夾下的FrameworkeLib.framework文件由白色變成了黑色,右鍵show in finder 顯示如下:


打包後果

FrameworkeLib.framework拖入項目便可直接運用,這裡就不再停止測試了。此外還要補充的一點是,打包靜態庫的時分還需留意打包的是測試版(Debug)還是發布版(Release),這個依據你自己的需求決議,而如何停止設置請下一步驟。

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

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


     設置版本

     感激閱讀,希望能協助到大家,謝謝大家對本站的支持!

【IOS 打包靜態庫詳細引見】的相關資料介紹到這裡,希望對您有所幫助! 提示:不會對讀者因本文所帶來的任何損失負責。如果您支持就請把本站添加至收藏夾哦!

  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved