IOS 打包靜態庫詳細介紹_IOS

來源:互聯網
上載者:User

IOS 打包靜態庫詳細介紹

一、前言

前段時間看的一本書上說:“隔著一段距離看,很多有趣的知識看起來都很唬人。”比如說這篇我要總結的“靜態庫知識”,在我初出茅廬的時候著實覺得那些尾碼名為“.frameworke”、“.a”、“.dylib”的檔案很神秘,很高冷。那時我雖然知道只要匯入一個庫就能引用庫裡面很多封裝好的東西,但對這個“庫”究竟是什麼“鬼”,一直都是雲裡霧裡。好了廢話不多說,看下去就知道它是個什麼“鬼”。

二 、一些概念的補充

1、 什麼是庫?

所謂庫就是程式碼的集合,是共用程式碼的一種方式。

2、 庫的分類

根據程式碼的開源情況,庫可以分為兩類

開源庫

原始碼是公開的,你可以看到具體實現。比如GitHub上比較出名的第三方架構AFNetworking、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


                                                             設定版本

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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.