iOS中生成靜態(tài)庫(kù)的那點(diǎn)事

什么是庫(kù)?

庫(kù)就是程序代碼的集合, 將N個(gè)文件組織起來(lái), 是共享程序代碼的一種方式

庫(kù)的分類(lèi)?

開(kāi)源庫(kù): 源碼是公開(kāi)的, 可以看到每個(gè)實(shí)現(xiàn)文件 .m 的實(shí)現(xiàn), 例如 Github 上常用的開(kāi)源庫(kù) AFNetworking, SDWebImage 等.

閉源庫(kù): 不公開(kāi)源碼, 是經(jīng)過(guò)編譯后的二進(jìn)制文件, 看不到具體的實(shí)現(xiàn). 閉源庫(kù)又分為: 靜態(tài)庫(kù) 和 動(dòng)態(tài)庫(kù)

靜態(tài)庫(kù)的存在形式?

.a

.framework

動(dòng)態(tài)庫(kù)的存在形式?

.dylib

.framework

靜態(tài)庫(kù)和動(dòng)態(tài)庫(kù)的區(qū)別?

.a 文件肯定是靜態(tài)庫(kù), .dylib 肯定是動(dòng)態(tài)庫(kù), .framework 可能是靜態(tài)庫(kù)也可能是動(dòng)態(tài)庫(kù)

靜態(tài)庫(kù)在鏈接時(shí), 會(huì)被完整的賦值到可執(zhí)行文件中, 如果多個(gè)APP都使用了同一個(gè)靜態(tài)庫(kù), 那么每個(gè)APP都會(huì)拷貝一份, 缺點(diǎn)是浪費(fèi)內(nèi)存, 類(lèi)似于定義一個(gè)基本變量, 使用該基本變量是新復(fù)制了一份數(shù)據(jù), 而不是原來(lái)定義的

動(dòng)態(tài)庫(kù)不會(huì)復(fù)制,只有一份, 程序運(yùn)行時(shí)動(dòng)態(tài)加載到內(nèi)存中, 系統(tǒng)只會(huì)加載一次, 多個(gè)程序公用一份, 節(jié)約了內(nèi)存. 類(lèi)似于使用變量的內(nèi)存地址一樣. 使用的是同一個(gè)變量

但是項(xiàng)目中如果使用了自己定義的動(dòng)態(tài)庫(kù), 蘋(píng)果是不允許上架的, 在 iOS8 后 蘋(píng)果開(kāi)放了動(dòng)態(tài)加載 .dylib 的接口, 用于掛載 .dylib 動(dòng)態(tài)庫(kù)

靜態(tài)庫(kù)的運(yùn)用場(chǎng)景?

保護(hù)自己的核心代碼, 如訊飛語(yǔ)音摸索了好多年探索出的結(jié)果當(dāng)然要保存起來(lái), 都公開(kāi)了公司怎么生存

將MRC的項(xiàng)目打包成靜態(tài)庫(kù), 可以在ARC下直接使用, 不用轉(zhuǎn)換, 如別人使用 MRC 寫(xiě)的開(kāi)源庫(kù), 放到自己的ARC項(xiàng)目中, 需要對(duì)每個(gè)文件加一個(gè)編譯參數(shù)-fno-objc-arc這樣相對(duì)來(lái)說(shuō)很麻煩, 將整個(gè)工程打包成靜態(tài)庫(kù)直接放到項(xiàng)目中即可, 也不用對(duì)每個(gè)文件添加編譯選項(xiàng)

靜態(tài)庫(kù)的特點(diǎn)?

.a + .h

.a : 可以看做所有 .m 文件加密后的一個(gè)二進(jìn)制文件

.h : 頭文件, 用戶(hù)暴露可用的接口 (方法)

制作靜態(tài)庫(kù)的過(guò)程 .a

new -> project -> Cocoa Touch Static Liabrary

編寫(xiě)邏輯代碼

Build Phases -> Copy Files 添加要暴露的頭文件

Build Setting -> Build Active Architecture only (只構(gòu)建活躍構(gòu)架) -> nO

a. 所有模擬器調(diào)試版本靜態(tài)庫(kù): 選中模擬器 command + b

b. 真機(jī)調(diào)試版本靜態(tài)庫(kù): 選中 generic iOS Device , Command + b

c. 真機(jī)發(fā)布靜態(tài)庫(kù): 選中 generic iOS Device , Edit scheme Run -> Build Configuration -> Release.? ? command +b

工程文件夾 Produts 下的 .a 文件就是編譯得到的靜態(tài)文件

右鍵 show finder 查看所有版本的靜態(tài)庫(kù)

Debug-iphonesos 調(diào)試 真機(jī)版本

Debug-iphonesimulator 調(diào)試 模擬器版本

Release-iphoneos 發(fā)布 真幾版本

Release-iphonesimulator 發(fā)布 模擬器版本

8 . 如何引入靜態(tài)庫(kù)?

直接把 對(duì)應(yīng)靜態(tài)庫(kù) .a? 和 暴露的.h 文件 拖入到 目標(biāo)工程中即可

合并靜態(tài)庫(kù)?

lipo -create 模擬器調(diào)試.a 模擬器發(fā)布.a 真機(jī)調(diào)試.a 真機(jī)發(fā)布.a output 通用.a

靜態(tài)庫(kù)注意:

自己的靜態(tài)庫(kù)給別人用, 一般都是給兩個(gè)發(fā)布版本 (模擬器, 真機(jī)), 最好不要合并. 如果給了用戶(hù)合并版的, 用戶(hù)無(wú)法分解.

關(guān)于 lipo 命令

點(diǎn)擊查看lipo命令

關(guān)于構(gòu)架:

構(gòu)架是什么?

CPU 構(gòu)架 是 CPU 廠商給屬于同一系列的 CPU 產(chǎn)品定的一個(gè)規(guī)范, 主要目的是為了區(qū)分不同類(lèi)型 CPU? 的重要指示, 模擬器上的構(gòu)架和真機(jī)上的構(gòu)架不是一樣的, 模擬器和模擬器之間, 真機(jī)和真機(jī)之間的構(gòu)架也是不同的, 如果靜態(tài)庫(kù)的構(gòu)架和測(cè)試項(xiàng)目對(duì)應(yīng)的模擬器或者真機(jī)上的構(gòu)架不對(duì)應(yīng)就會(huì)報(bào)錯(cuò) "Undefined symbols for architecture arm64/i386"

查看靜態(tài)庫(kù)對(duì)應(yīng)的構(gòu)架: lipo -info Xxx.a

靜態(tài)庫(kù)都支持哪些構(gòu)架?

模擬器架構(gòu)

? ? iPhone4s ~ 5 : i386

? ? iPhone5s ~ 7Plus : x86_64

真機(jī)架構(gòu)

? ? 3GS~4s : armv7

? ? 5/5c : armv7s(armv7兼容armv7s)

? ? 5s ~ 6sPlus : arm64

模擬器32位處理器測(cè)試需要i386架構(gòu)宵膨,

模擬器64位處理器測(cè)試需要x86_64架構(gòu)汗盘,

真機(jī)32位處理器需要armv7,或者armv7s架構(gòu),

真機(jī)64位處理器需要arm64架構(gòu)澜建。

靜態(tài)庫(kù)的制造過(guò)程 .framework

new -> project -> Cocoa Touch Framework

Build Settings -> Mach-O Type -> Static Library (默認(rèn)是 Dynamic Library)

編寫(xiě)邏輯代碼

公開(kāi)頭文件 Build Phases -> Headers -> 把Project 中需要暴露的 .h 文件拖到 Public 中

將要公開(kāi)的所有頭文件 引入到 總的頭文件 (庫(kù)名.h) 中,

Build Setting -> Build Active Architecture Only -> NO

同 靜態(tài)庫(kù).a 制作的步驟 5

項(xiàng)目文件夾 Products 下 的 庫(kù)名.framework 右鍵 show finder

同 .a 靜態(tài)庫(kù)制作的步驟7 得到所有類(lèi)型版本的framework

將 需要的framework 拖入到目標(biāo)工程中, 調(diào)用靜態(tài)庫(kù)的方法

2.動(dòng)態(tài)庫(kù) .framework

步驟跟 靜態(tài)庫(kù) .framework 類(lèi)似, 下面是不同的地方

1. Mach-O type -> Dynamic Library

將生成的動(dòng)態(tài)庫(kù) .framework 拖入到目標(biāo)工程之后

2. General -> Embedded Binaries 中 添加該.framework

3. Linked Frameworks and libraries 中 會(huì)默認(rèn)添加該 .framework

swift framework 動(dòng)態(tài)庫(kù) (swift 不支持靜態(tài)庫(kù))

1. File --> project --> Cocoa Touch Framework (選擇swift 語(yǔ)言)

創(chuàng)建你需要的 swift 文件. 完成代碼邏輯

2. Build Phases --> Headers Public 中添加所有用得到的swift 文件

要注意: 所有要暴露出來(lái)的swift 類(lèi)和方法 都必須用public 修飾

3. Build Settings -> Mach-O type 選擇 Dynamic library (swift 語(yǔ)言智能選擇動(dòng)態(tài)庫(kù))

4. Build Active Architecture Only? 設(shè)為 NO

5. command + b? 編譯一遍代碼, 如果沒(méi)有問(wèn)題的話(huà), 動(dòng)態(tài)庫(kù)已經(jīng)生成好了

6. 工程文件夾 Products文件夾中 有個(gè).framework 文件, 選中, 右鍵 show finder

7. 可以拿到 .framework 文件

8. 把 framework 文件拖入要用到的工程中

9. General --> Embedded Binaries 中加入剛剛拖進(jìn)去的 framework

10. 當(dāng)framework 拖入工程后 xcode 會(huì)自動(dòng)給 swift類(lèi)型的 framework 創(chuàng)建一個(gè)文件 (庫(kù)名-swift.h)

11. 工程中 引入 文件 庫(kù)名-swift.h 后, 就可以調(diào)用所有 framework中暴露出來(lái)的 swift 方法.

有時(shí)候項(xiàng)目需要在集成C++靜態(tài)庫(kù)的基礎(chǔ)之上,去用OC進(jìn)行封裝暴露對(duì)外的接口,實(shí)現(xiàn)iOS中SDK的完成。

在C++編譯靜態(tài)庫(kù)的過(guò)程中琼了,有個(gè)bitcode選項(xiàng)要注意,用C++編譯靜態(tài)庫(kù)的時(shí)候困曙,盡量支持bitcode否則表伦,你在鏈接的時(shí)候會(huì)出現(xiàn)錯(cuò)誤谦去。你需要設(shè)置工程中target的Enable Bitcode為NO才可以正常編譯慷丽。

在程序支持的編譯框架中可以在Architectures中選擇arm64 /arm64e/armv7...

Xcode設(shè)置項(xiàng)之Architectures和Valid Architectures和Build Active?Architectures Only參數(shù)的選擇 應(yīng)當(dāng)特別注意

項(xiàng)目中編譯c++文件的時(shí)候,需要修改項(xiàng)目中任意一個(gè).m文件的后綴為.mm否則編譯不通過(guò)

項(xiàng)目中的資源文件應(yīng)該放在bundle文件中鳄哭,利用oc中的從bundle文件中取資源的方式存取要糊。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市妆丘,隨后出現(xiàn)的幾起案子锄俄,更是在濱河造成了極大的恐慌局劲,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件奶赠,死亡現(xiàn)場(chǎng)離奇詭異鱼填,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)毅戈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)苹丸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人苇经,你說(shuō)我怎么就攤上這事赘理。” “怎么了扇单?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵商模,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我蜘澜,道長(zhǎng)施流,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任兼都,我火速辦了婚禮嫂沉,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘扮碧。我一直安慰自己趟章,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布慎王。 她就那樣靜靜地躺著蚓土,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赖淤。 梳的紋絲不亂的頭發(fā)上蜀漆,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天,我揣著相機(jī)與錄音咱旱,去河邊找鬼确丢。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吐限,可吹牛的內(nèi)容都是我干的鲜侥。 我是一名探鬼主播,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼诸典,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼描函!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤舀寓,失蹤者是張志新(化名)和其女友劉穎胆数,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體互墓,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡必尼,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了篡撵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胰伍。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖酸休,靈堂內(nèi)的尸體忽然破棺而出骂租,到底是詐尸還是另有隱情,我是刑警寧澤斑司,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布渗饮,位于F島的核電站,受9級(jí)特大地震影響宿刮,放射性物質(zhì)發(fā)生泄漏互站。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一僵缺、第九天 我趴在偏房一處隱蔽的房頂上張望胡桃。 院中可真熱鬧,春花似錦磕潮、人聲如沸翠胰。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)之景。三九已至,卻和暖如春膏潮,著一層夾襖步出監(jiān)牢的瞬間锻狗,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工焕参, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留轻纪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓叠纷,卻偏偏與公主長(zhǎng)得像刻帚,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子讲岁,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

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

  • 1我擂、通過(guò)CocoaPods安裝項(xiàng)目名稱(chēng)項(xiàng)目信息 AFNetworking網(wǎng)絡(luò)請(qǐng)求組件 FMDB本地?cái)?shù)據(jù)庫(kù)組件 SD...
    陽(yáng)明先生_x閱讀 15,968評(píng)論 3 119
  • 一直以來(lái),我們?cè)诤⒆拥亩吇貉蓿蛘叨崦婷米疃嗟氖?好好讀書(shū)校摩。可奇怪的是阶淘,我們的家長(zhǎng)幾乎從來(lái)不讀書(shū)衙吩。一個(gè)不怎么讀...
    陳寧兒童與家庭教育研究院閱讀 1,721評(píng)論 3 7
  • 放松,讓自己盡量放松溪窒,豁達(dá)一點(diǎn)坤塞,正確的做事就行。
    L牧閱讀 121評(píng)論 0 0
  • 2017年12月31日晚澈蚌,讀書(shū)時(shí)間到摹芙,我是星耀小學(xué)三年二班的孫梓航,主動(dòng)讀書(shū)第一天宛瞄,內(nèi)容《東晉十六國(guó)-亂世紛爭(zhēng)的時(shí)...
    SUNZIHANG夢(mèng)想成真閱讀 144評(píng)論 1 1
  • 上午九點(diǎn)召開(kāi)新學(xué)期教師會(huì)浮禾。我重新布置了教師培訓(xùn)選課注意事項(xiàng)。 下午在家剛洗完衣服份汗,想要休息一下盈电,手機(jī)發(fā)進(jìn)來(lái)一條“有...
    百合小香閱讀 723評(píng)論 1 5