iOS的靜態(tài)庫和動(dòng)態(tài)庫(.a、.framework)版仔、Undefined symbols for architecture x86_64隅忿、Invalid bitcode signature錯(cuò)誤的...

1. 什么是類庫?

類庫就是程序代碼的集合,是共享程序的一種特殊方式,主要分為兩種類型:
1.開源 : 公開源代碼.可以看到具體實(shí)現(xiàn)
2.閉源 : 不公開源代碼,是經(jīng)過編譯后的二進(jìn)制文件,看不到代碼具體實(shí)現(xiàn),也主要分為兩種類型, 即:動(dòng)態(tài)庫和靜態(tài)庫.(.a類庫使用""來導(dǎo)入頭文件,.framework使用<>來導(dǎo)入頭文件)

2. 靜態(tài)庫

1.后綴一般為.a 或者.framework
2.鏈接時(shí),靜態(tài)庫中使用的文件會被完整的復(fù)制到可執(zhí)行文件中,被多次使用就有多份的冗余拷貝(比如手機(jī)上的兩個(gè)app都使用了友盟SDK的類庫,那么在每個(gè)app下都會完整的導(dǎo)入友盟的SDK的類庫)

3.動(dòng)態(tài)庫

1.后綴為.dylib 或者.framework; iOS9取消了.dylib更新為.tbd代替
2.鏈接時(shí)不會復(fù)制可執(zhí)行文件, 程序運(yùn)行時(shí)從系統(tǒng)動(dòng)態(tài)的加載到內(nèi)存,供程序應(yīng)用,系統(tǒng)只加載一次,多個(gè)程序公用,節(jié)省內(nèi)存
3.UIKit/foundation都是系統(tǒng)的動(dòng)態(tài)庫, 而自己的制作的動(dòng)態(tài)庫就會被拒絕上架(引入非系統(tǒng)的動(dòng)態(tài)庫上架都會被拒),原因就是防止中途可能被攻擊(動(dòng)態(tài)注入攻擊)心剥、蘋果每個(gè)app都有自己的獨(dú)立沙盒空間,若使用了自定義的動(dòng)態(tài)庫,就能實(shí)現(xiàn)的除了應(yīng)用內(nèi)跳轉(zhuǎn)之外(官方允許)的間接通訊了.

4.生成&使用.a靜態(tài)庫

4.1 創(chuàng)建類庫文件,選擇中間的生成.a靜態(tài)庫
項(xiàng)目創(chuàng)建.png
4.2 編譯文件即可生成.a靜態(tài)庫
CreatLib.png
4.3 ShowInFinder后的路徑,在真機(jī)和模擬器都進(jìn)行編譯,得到兩個(gè)文件,即兩個(gè)不同的靜態(tài)庫;文件中的liblibraryDemo.a就是得到靜態(tài)庫,libraryDemo.h就是暴露給外界的.h文件;使用時(shí)直接把Debug-iphoneos或者Debug-iphonesimulator文件直接拖拽到項(xiàng)目中,引入頭文件就可以使用了
Library.png
4.4 自定義類和資源文件需要進(jìn)行公開 : 自定義的類或者資源文件在編譯后沒有添加到公開的.h文件夾中,這時(shí)使用該靜態(tài)庫的程序就會提示找不到文件,這樣的情況下就需要手動(dòng)導(dǎo)入.
未引入自定義的類的.h文件.png
引入方法.png
4.5 資源包(同名資源沖突) :
  1. 若資源文件按照如上的操作添加到類庫中,且項(xiàng)目中和類庫中有同名資源,不管是項(xiàng)目調(diào)用,還是類庫中調(diào)用,都會加載項(xiàng)目中的文件;
  2. 封裝類庫時(shí),需要將資源文件打包成Bundle進(jìn)行添加,這種方式有效避免同名資源沖突;
  3. 在類庫的路徑下直接新建文件夾存入資源,改名字為xx.bundle,然后按照4.4的引入方法公開bundle文件,這樣在類庫內(nèi)部或者外部需要使用該資源是就引用"xx.bundle/資源名稱"就可以了.

5. 架構(gòu)合成 (architecture x86_64就叫架構(gòu))

5.1 架構(gòu)
  1. CPU架構(gòu) -> 設(shè)計(jì)模式
  2. 主流架構(gòu)分兩種:
    2.1 精簡指令集: 一般給移動(dòng)設(shè)備/平臺設(shè)備使用 ARM/IBM(兩家公司)
    armv7 iPhone 3GS, iPhone 4, iPhone 4S, iPad , iPad 2等
    armv7s iPhone 5, 5C系列, iPad 4 等
    arm64(armv8) iPhone 5s及以上, iPad Air, Retina iPad Mini等
    2.2 復(fù)雜指令集: 一般給PC Intel/AMD
    i386 iPhone 4s,iPhone 5的模擬器
    x86_64 iPhone 5s及以上的模擬器
5.2 當(dāng)使用真機(jī)情況下編譯得到的靜態(tài)庫,運(yùn)行在模擬器上,會編譯報(bào)錯(cuò):
模擬器運(yùn)行只支持真機(jī)的靜態(tài)庫.png
5.2.1 Undefined symbols for architecture x86_64錯(cuò)誤
Xcode7.0之前報(bào)錯(cuò).png

解決方案 : 翻譯過來就是XX架構(gòu)出現(xiàn)沒定義符號,屬于鏈接錯(cuò)誤;出現(xiàn)這個(gè)錯(cuò)誤只有兩種原因:
1.項(xiàng)目中沒有導(dǎo)入該類庫
2.項(xiàng)目運(yùn)行的平臺(架構(gòu))和類庫生成的平臺(架構(gòu))不一致

很明顯上面的錯(cuò)誤原因就是因?yàn)樵谀M器上運(yùn)行了真機(jī)情況下編譯得到的類庫,所以讓我們的類庫支持以上所有架構(gòu),就能解決問題了.

5.2.2 封裝類庫時(shí)如何解決架構(gòu)不一致問題(就是讓類庫支持所有架構(gòu))
  1. 生成5個(gè)類庫,并說明對應(yīng)架構(gòu)版本
  2. Xcode7.0之后都采取這個(gè)方法:進(jìn)行架構(gòu)合成(把5個(gè)類庫合成到一個(gè)文件中)

查看類庫包含的架構(gòu):
終端指令 lipo -info 類庫文件的路徑(直接拖進(jìn)來)
查看類庫的類型:

終端指令 file 類庫文件路徑(Mach-O 64-bit dynamically linked shared library x86_64為動(dòng)態(tài)庫)
終端查看庫類型

合成架構(gòu):

  1. 使用lipo工具進(jìn)行合成: lipo -create 類庫1路徑 類庫2路徑 -output 新類庫路徑
  2. 使用Xcode來合成類庫 (優(yōu)點(diǎn):沒有對應(yīng)架構(gòu)的設(shè)備也可以生成支持所有架構(gòu)的類庫)
    Xcode合并.png

    2.1 生成真機(jī)組的架構(gòu)默認(rèn)會缺armv7s 解決辦法:
    armv7s補(bǔ)充.png
    2.2 在設(shè)置為NO的情況下模擬器和真機(jī)分別運(yùn)行一下,然后通過lipo工具進(jìn)行合成即可.
5.2.3 Invalid bitcode signature錯(cuò)誤
Xcode10報(bào)錯(cuò).png

這種錯(cuò)誤的原因很多,需要看一下詳細(xì)信息;在這里發(fā)現(xiàn)是提供的類庫是iphoneOS的且不支持x86_64
1.更換新的類庫
2.刪減有效架構(gòu)


image.png

6. 生成&使用Framework類庫

  1. 創(chuàng)建類庫的時(shí)候選擇Cocoa Touch Framework即可. dynamicDemo.framework文件下的dynamicDemo文件才是自定義的framework庫
    編譯得到framework類庫
    類庫版本設(shè)置
  2. framework類庫就是個(gè)穿著馬甲的文件夾
  3. framework中自定義的類也需要公開
    自定義類的公開
  4. framework生成的默認(rèn)是動(dòng)態(tài)庫
  5. framework中的資源bundle(默認(rèn)生成)需要手動(dòng)導(dǎo)入到項(xiàng)目
    資源文件公開
  6. 在外界直接調(diào)用framework,運(yùn)行報(bào)錯(cuò)
    鏈接錯(cuò)誤截圖
    解決辦法
    項(xiàng)目引入framework中的資源文件
  7. framework改為靜態(tài)庫
    修改類庫產(chǎn)出物
    生成的動(dòng)態(tài)庫
    生成的靜態(tài)庫
  8. framework的架構(gòu)合成與.a類庫相同

7. framework和library的關(guān)系

.a靜態(tài)庫是Unix的靜態(tài)庫,可以跨平臺使用
.framework是iOS推出的,本質(zhì)就是將類庫的頭文件&資源文件&類庫文件進(jìn)行了打包

拓展 : Bitcode 應(yīng)用瘦身

  1. iOS9推出新特性,如果項(xiàng)目使用了Bit-code,則AppStore可以將項(xiàng)目中用到的類庫文件進(jìn)行分離(按照架構(gòu)分離,可以將1個(gè)合成的文件改回5個(gè)文件),當(dāng)手機(jī)要下載某個(gè)APP時(shí),AppStore會根據(jù)手機(jī)的架構(gòu),將對應(yīng)架構(gòu)的類庫放進(jìn)應(yīng)用的執(zhí)行文件供用戶下載,這樣有利于減少類庫占用的空間
  2. 所有Xcode7開始創(chuàng)建的項(xiàng)目都會有bitcode選項(xiàng),且默認(rèn)為YES
  3. Bitcode有一個(gè)特點(diǎn): 一旦項(xiàng)目使用了BitCode,則項(xiàng)目中用到的所有類庫也必須要支持Bit-code,如果不支持,編譯不通過(報(bào)錯(cuò)會提示是Bit-code出現(xiàn)問題)
  4. 如果項(xiàng)目中使用類庫不支持bit-code,且沒有其他替代方案,就只能設(shè)置項(xiàng)目bitcode=NO

以上類庫的使用都是按照個(gè)人的理解整理出來的,如果有什么問題,歡迎大家指正糾錯(cuò),萬分感謝!
.End

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市背桐,隨后出現(xiàn)的幾起案子优烧,更是在濱河造成了極大的恐慌,老刑警劉巖链峭,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件畦娄,死亡現(xiàn)場離奇詭異,居然都是意外死亡弊仪,警方通過查閱死者的電腦和手機(jī)熙卡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來励饵,“玉大人驳癌,你說我怎么就攤上這事∫厶” “怎么了颓鲜?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長典予。 經(jīng)常有香客問我甜滨,道長,這世上最難降的妖魔是什么瘤袖? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任衣摩,我火速辦了婚禮,結(jié)果婚禮上捂敌,老公的妹妹穿的比我還像新娘艾扮。我一直安慰自己,他們只是感情好占婉,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布泡嘴。 她就那樣靜靜地躺著,像睡著了一般锐涯。 火紅的嫁衣襯著肌膚如雪磕诊。 梳的紋絲不亂的頭發(fā)上填物,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天纹腌,我揣著相機(jī)與錄音,去河邊找鬼滞磺。 笑死升薯,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的击困。 我是一名探鬼主播涎劈,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼广凸,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蛛枚?” 一聲冷哼從身側(cè)響起谅海,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎蹦浦,沒想到半個(gè)月后扭吁,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡盲镶,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年侥袜,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片溉贿。...
    茶點(diǎn)故事閱讀 40,040評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡枫吧,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宇色,到底是詐尸還是另有隱情九杂,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布代兵,位于F島的核電站尼酿,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏植影。R本人自食惡果不足惜裳擎,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望思币。 院中可真熱鬧鹿响,春花似錦、人聲如沸谷饿。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽博投。三九已至绸贡,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間毅哗,已是汗流浹背听怕。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留虑绵,地道東北人尿瞭。 一個(gè)月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像翅睛,于是被迫代替她去往敵國和親声搁。 傳聞我的和親對象是個(gè)殘疾皇子黑竞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評論 2 355

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