iOS 中 .a 和 .framework 靜態(tài)庫的創(chuàng)建與 .bundle 資源包的使用

iOS 中 .a 和 .framework 靜態(tài)庫的創(chuàng)建與 .bundle 資源包的使用

前言

開發(fā)中經(jīng)常使用三方庫去實現(xiàn)某特定功能殖妇,而這些三方庫通常又分為開源庫和閉源庫。開源庫可以直接拿到源碼硬耍,和自己寫的沒有什么區(qū)別,我們可以最大程度的修改源碼來適應(yīng)自己功能个束。閉源庫就是被發(fā)布者提前打包好的靜態(tài)庫或 Bundle 包恍涂,對此我們無法看到內(nèi)部實現(xiàn),對于其封裝好的特定功能足丢,我們也只需要調(diào)用其開放的API即可粱腻。

本文就來講解一下 .a 和 .framework 靜態(tài)庫的創(chuàng)建與 .bundle 資源包的使用。

庫分靜態(tài)庫和動態(tài)庫兩種斩跌。從本質(zhì)上來說是一種可執(zhí)行代碼的二進制格式绍些,可以被載入內(nèi)存中執(zhí)行。

靜態(tài)庫和動態(tài)庫是相對編譯期和運行期的:靜態(tài)庫在程序編譯時會被鏈接到目標(biāo)代碼中耀鸦,程序運行時將不再需要改靜態(tài)庫柬批;而動態(tài)庫在程序編譯時并不會被鏈接到目標(biāo)代碼中,只是在程序運行時才被載入袖订,因為在程序運行期間還需要動態(tài)庫的存在氮帐。

靜態(tài)庫的形式

形式為 :.a 和 .framework 兩種

其中 .framework 類型的庫如果是系統(tǒng)內(nèi)部的是動態(tài)庫,我們自己創(chuàng)建的是靜態(tài)庫

.a 和 .framework 的區(qū)別

.a是一個純二進制文件洛姑,.framework中除了有二進制文件之外還有資源文件上沐。
.a文件不能直接使用,至少要有.h文件配合楞艾,.framework文件可以直接使用参咙。
.a + .h + sourceFile = .framework。
建議用.framework硫眯。

靜態(tài)庫的優(yōu)勢

  1. 方便共享代碼蕴侧,便于合理使用。
  2. 實現(xiàn)iOS程序的模塊化两入【幌可以把固定的業(yè)務(wù)模塊化成靜態(tài)庫。
  3. 和別人分享你的代碼庫裹纳,但不想讓別人看到你代碼的實現(xiàn)择葡。
  4. 開發(fā)第三方sdk的需要。

創(chuàng)建和打包 .a 靜態(tài)庫

  1. 創(chuàng)建靜態(tài)庫項目

    iOS --> Framework & Library --> Cocoa Touch Static Library
  2. 把需要編譯成靜態(tài)庫的代碼拖進項目
  3. 設(shè)置可見的.h文件痊夭。

    Build Phases --> Copy Files 添加.h文件即可刁岸。
15121192841839.jpg
15121206665244.png
15121206796855.png
15121206850570.png
  1. 修改支持的架構(gòu)
    4.1 設(shè)置支持所有模擬器架構(gòu) Build Settings --> Build Active Architecture Only --> Debug 改為 NO
    4.2設(shè)置支持所有手機架構(gòu)

  2. 編譯
    編譯一次模擬器,編譯一次手機。
    會生成.a文件 和 可見的頭文件她我。
    使用命令行虹曙,合并剛剛生成的的兩個路徑迫横,到另一個路徑,例如:
    lipo -create 模擬器lib路徑 真機lib路徑 -output /Users/username/Desktop/libPSSTest.a

  1. 使用靜態(tài)庫
    注意:如果這個靜態(tài)庫需要依賴庫酝碳,也是需要引入依賴庫矾踱。

創(chuàng)建和打包 .framework 靜態(tài)庫

  1. 創(chuàng)建Framework項目
    iOS --> Framework & Library --> Cocoa Touch Framework

  2. 修改打包的framework是動態(tài)庫還是靜態(tài)庫
    framework項目默認(rèn)是動態(tài)庫。
    靜態(tài)庫配置:Build Settings --> Mach-O Type --> 改為 Static Library

  3. 把需要編譯成靜態(tài)庫的代碼拖進項目
    設(shè)置可見頭文件
    項目創(chuàng)建后,項目中只有一個主頭文件疏哗。
    Build Phases --> Headers --> public 添加頭文件

  4. 編譯
    編譯一次模擬器,編譯一次手機

  5. 使用
    把framework引入項目呛讲。
    如果是動態(tài)庫需要在 General --> Embedded Binaries 中引入配置。
    如果是靜態(tài)庫就不需要配置了返奉。

靜態(tài)庫問題

  1. 靜態(tài)庫位置
    Debug運行真機編譯會把靜態(tài)庫生成到 Debug-iphoneos目錄下

    Debug運行模擬器編譯會把靜態(tài)庫生成到 Debug-iphonesimulator目錄下

    Release運行真機編譯會把靜態(tài)庫生成到 Release-iphoneos目錄下
    Release運行模擬器編譯會把靜態(tài)庫生成到 Release-iphonesimulator目錄下

  2. Debug版本 VS Release版本

    • 調(diào)試版

      調(diào)試版本會包含完整的符號信息贝搁,以方便調(diào)試
      調(diào)試版本不會對代碼進行優(yōu)化
    • 發(fā)布版

      發(fā)布版本不會包含完整的符號信息
      發(fā)布版本的執(zhí)行代碼是進行過優(yōu)化的
      發(fā)布版本的大小會比調(diào)試版本的略小
      在執(zhí)行速度方面,調(diào)試版本會更快些芽偏,但不意味著會有顯著的提升
  3. Undefind symbols for architecture arm64(i386)

    原因:是靜態(tài)庫不支持cpu arm64(i386)架構(gòu)

  4. iPhone手機的cpu架構(gòu)

    • 模擬器

      iPhone4s,5 是 i386架構(gòu)
      iPhone5s以后 是x86_64架構(gòu)
    • 發(fā)布版

      iphone1代,3G,3GS 是 armv6架構(gòu)

      iPhone4,4s 是 armv7架構(gòu)

      iphone5,5s,5c 是 armv7s架構(gòu)

      iPhone6,6s,6plus,6splus 是 arm64架構(gòu)
  5. 查看.a庫所支持的架構(gòu)類型
    lipo -info xxx.a

  6. .a靜態(tài)庫合并
    lipo -create 真機靜態(tài)庫.a 模擬器靜態(tài)庫.a -output 新文件.a
    (最好指定一個目錄,否則會默認(rèn)當(dāng)前目錄)
    只合并Debug版本 或者 只合并Release版本即可雷逆。

  7. 查看.framework庫所支持的架構(gòu)類型
    7.1 進入到framework文件夾中
    7.2 lipo -info Framework 即可

靜態(tài)庫編譯錯誤

  1. MRC 錯誤:會提示好多的autorelease,release,retain等錯誤

    解決方案:給這個文件MRC編譯 或者項目改成MRC環(huán)境
  2. 找不到 <libxml/HTMLparser.h>頭文件
    編譯缺少系統(tǒng)庫,配置:Build Settings --> 搜索Header Search Paths --> 配置 $(SDK_DIR)/usr/include/libxml2
  3. framework項目污尉,名字中不能帶特殊字符
    會報 test-framework is not a valid PROJECT_NAME

依賴庫錯誤

1._SCNetWork開頭
導(dǎo)入SystemConfiguration.framework
2._UITypeCopy開頭 + _kUITag開頭
  導(dǎo)入MobileCoreServices.framework
3._defalate開頭 + _inflate開頭
  導(dǎo)入 libz.tbd
4._xml開頭
  導(dǎo)入libxml2.tbd

引入靜態(tài)庫運行錯誤

1.運行崩潰
假設(shè)不是靜態(tài)庫內(nèi)部錯誤,那么就設(shè)置項目的Build Settings --> Other Linker Flags --> 為 -ObjC

資源靜態(tài)庫.bundle

1.創(chuàng)建一個文件夾
2.把資源(圖片,plist...)放到文件夾中
3.把文件夾后綴改為bundle就可以了
4.資源庫的使用
在靜態(tài)庫中膀哲,我們獲得資源的方式改為從這個bundle資源包中獲得就可以了。
例如:[UIImage imageNamed:@"xxx.bundle/xxx"];

創(chuàng)建一個可測試的靜態(tài)庫

1.創(chuàng)建一個項目
2.給項目添加一個靜態(tài)庫Target
3.編譯靜態(tài)庫
4.配置引用靜態(tài)庫
General --> Linked Frameworks and Libraries --> 添加靜態(tài)庫.a
5.運行項目 -- 這樣就可以調(diào)試了.

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末被碗,一起剝皮案震驚了整個濱河市某宪,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌锐朴,老刑警劉巖兴喂,帶你破解...
    沈念sama閱讀 217,509評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異焚志,居然都是意外死亡瞻想,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,806評論 3 394
  • 文/潘曉璐 我一進店門娩嚼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人滴肿,你說我怎么就攤上這事岳悟。” “怎么了泼差?”我有些...
    開封第一講書人閱讀 163,875評論 0 354
  • 文/不壞的土叔 我叫張陵贵少,是天一觀的道長。 經(jīng)常有香客問我堆缘,道長滔灶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,441評論 1 293
  • 正文 為了忘掉前任吼肥,我火速辦了婚禮录平,結(jié)果婚禮上麻车,老公的妹妹穿的比我還像新娘。我一直安慰自己斗这,他們只是感情好动猬,可當(dāng)我...
    茶點故事閱讀 67,488評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著表箭,像睡著了一般赁咙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上免钻,一...
    開封第一講書人閱讀 51,365評論 1 302
  • 那天彼水,我揣著相機與錄音,去河邊找鬼极舔。 笑死凤覆,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的姆怪。 我是一名探鬼主播叛赚,決...
    沈念sama閱讀 40,190評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼稽揭!你這毒婦竟也來了俺附?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,062評論 0 276
  • 序言:老撾萬榮一對情侶失蹤溪掀,失蹤者是張志新(化名)和其女友劉穎事镣,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體揪胃,經(jīng)...
    沈念sama閱讀 45,500評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡璃哟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,706評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了喊递。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片随闪。...
    茶點故事閱讀 39,834評論 1 347
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖骚勘,靈堂內(nèi)的尸體忽然破棺而出铐伴,到底是詐尸還是另有隱情,我是刑警寧澤俏讹,帶...
    沈念sama閱讀 35,559評論 5 345
  • 正文 年R本政府宣布当宴,位于F島的核電站,受9級特大地震影響泽疆,放射性物質(zhì)發(fā)生泄漏户矢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,167評論 3 328
  • 文/蒙蒙 一殉疼、第九天 我趴在偏房一處隱蔽的房頂上張望梯浪。 院中可真熱鬧捌年,春花似錦、人聲如沸驱证。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,779評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抹锄。三九已至逆瑞,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間伙单,已是汗流浹背获高。 一陣腳步聲響...
    開封第一講書人閱讀 32,912評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留吻育,地道東北人念秧。 一個月前我還...
    沈念sama閱讀 47,958評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像布疼,于是被迫代替她去往敵國和親摊趾。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,779評論 2 354

推薦閱讀更多精彩內(nèi)容