亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 系統 > iOS > 正文

IOS 打包靜態庫詳細介紹

2020-07-26 03:05:39
字體:
來源:轉載
供稿:網友

IOS 打包靜態庫詳細介紹

一、前言

前段時間看的一本書上說:“隔著一段距離看,很多有趣的知識看起來都很唬人?!北热缯f這篇我要總結的“靜態庫知識”,在我初出茅廬的時候著實覺得那些后綴名為“.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


                                                             設置版本

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

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产精品久在线观看| 深夜成人在线观看| 国产日韩欧美综合| 亚洲bt欧美bt日本bt| 国产视频精品免费播放| 精品少妇一区二区30p| 69久久夜色精品国产69乱青草| 青草青草久热精品视频在线网站| 亚洲黄页网在线观看| 国产一区二区三区视频| 深夜福利日韩在线看| 日本aⅴ大伊香蕉精品视频| 日韩亚洲成人av在线| 在线丨暗呦小u女国产精品| 成人欧美一区二区三区黑人孕妇| 中文字幕免费精品一区| 久久久久久久久网站| 亚洲香蕉成人av网站在线观看| 久久99青青精品免费观看| 亚洲**2019国产| 日韩在线高清视频| 欧美黄色小视频| 日韩精品免费综合视频在线播放| 疯狂蹂躏欧美一区二区精品| 97婷婷涩涩精品一区| 亚洲欧美成人在线| 一本色道久久88精品综合| 国产成人福利视频| 国模极品一区二区三区| 啪一啪鲁一鲁2019在线视频| 国产不卡一区二区在线播放| 国产精品第3页| 伊人久久大香线蕉av一区二区| 色婷婷综合成人av| 日韩精品一区二区三区第95| 韩国福利视频一区| 亚洲激情在线观看视频免费| 久久视频国产精品免费视频在线| 2020国产精品视频| 欧美精品久久久久a| 日韩视频中文字幕| 日韩欧美一区二区在线| 中文字幕精品网| 最近2019中文字幕大全第二页| 欧美一区二区影院| 久久久91精品国产| 国产精品网站视频| 久久影视电视剧免费网站清宫辞电视| 国产精品成人免费电影| 色偷偷噜噜噜亚洲男人| 欧美交受高潮1| 日韩av在线播放资源| 欧美日韩亚洲一区二| 久久久国产一区二区| 日韩在线观看成人| 亚洲精品久久久久久久久久久久久| 日韩精品一二三四区| 久久综合伊人77777蜜臀| 在线看国产精品| 欧洲亚洲免费在线| 国产欧美日韩专区发布| 国产999在线观看| 国产成人短视频| 亚洲激情免费观看| 日产精品久久久一区二区福利| 欧美高清在线观看| 91精品在线观看视频| 51色欧美片视频在线观看| 91久久久久久| 欧美有码在线观看视频| 欧美日韩性视频在线| 最近2019好看的中文字幕免费| 国产精品高清在线观看| 九九热最新视频//这里只有精品| 国色天香2019中文字幕在线观看| 国产在线高清精品| 国产成人综合一区二区三区| 亚洲xxxx做受欧美| 亚洲a一级视频| 国产日韩中文在线| 午夜免费在线观看精品视频| 亚洲欧美日韩直播| 国产精品白嫩初高中害羞小美女| 欧美日韩国产一区中文午夜| 日韩成人av一区| 伊人成人开心激情综合网| 午夜精品久久久久久久白皮肤| 国产精品久久久久久久app| 亚洲视频欧洲视频| 欧美日韩在线视频一区| 亚洲高清久久久久久| 国产精品揄拍500视频| 欧美肥臀大乳一区二区免费视频| 国产999精品视频| 国产成人av网| 亚洲欧美国内爽妇网| 欧美日韩国产中文精品字幕自在自线| 国产精品白嫩美女在线观看| 视频在线观看一区二区| 久久久国产视频91| 国产午夜精品免费一区二区三区| 在线观看视频亚洲| 综合欧美国产视频二区| 久久精品国产91精品亚洲| 一区国产精品视频| 九九热在线精品视频| 欧美日韩国产精品一区二区不卡中文| 中文字幕亚洲激情| 成人春色激情网| 成人写真福利网| www欧美日韩| 亚洲a在线播放| 性欧美xxxx交| 日韩精品免费综合视频在线播放| 成人在线国产精品| 国产精品高潮呻吟久久av黑人| 69视频在线播放| 97久久精品在线| 亚洲视频在线观看视频| 久久亚洲精品成人| 欧美在线视频一区| 久久av在线播放| 97久久精品人人澡人人爽缅北| 亚州av一区二区| 尤物tv国产一区| 欧美电影电视剧在线观看| 国产精品福利小视频| 国产一区二区三区在线播放免费观看| 97精品国产91久久久久久| 91精品视频播放| 国产精品网红直播| 成人一区二区电影| 国产精品久久久久久亚洲影视| 亚洲人成网在线播放| www.亚洲免费视频| 操91在线视频| 韩国三级电影久久久久久| 中文字幕在线看视频国产欧美在线看完整| 性色av一区二区三区红粉影视| 欧美日韩成人网| 国产欧美一区二区三区视频| 久久视频在线观看免费| 日韩电影中文字幕在线| 亚洲成年人影院在线| 国产成人福利网站| 97精品国产97久久久久久春色| 亚洲最大在线视频| 在线精品国产成人综合| 国产中文欧美精品| 精品久久久在线观看| 免费av在线一区| 在线观看免费高清视频97| 久久777国产线看观看精品| 69av视频在线播放| 午夜精品久久久久久久久久久久| 一本一本久久a久久精品综合小说| 亚洲天堂男人天堂女人天堂| 日韩免费黄色av| 久久精品视频99| 欧美性受xxxx白人性爽| 伊人激情综合网| 成人av番号网| 亚洲欧美中文另类| 欧美成人免费小视频|