.a农猬、.framework庫制作之二(.a文件制作)

上篇赡艰,我們要制作一個(gè)通用的.a文件。

先上理論知識:

一斤葱、概要

平時(shí)項(xiàng)目開發(fā)中慷垮,可能使用第三方提供的靜態(tài)庫.a,如果.a提供方技術(shù)不成熟揍堕,使用的時(shí)候就會出現(xiàn)問題料身,例如:

在真機(jī)上編譯報(bào)錯(cuò):No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386).

在模擬器上編譯報(bào)錯(cuò):No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=armv7s, VALID_ARCHS=armv7 armv6).

要解決以上問題,就要了解一下Apple移動設(shè)備處理器指令集相關(guān)的一些細(xì)節(jié)知識衩茸。

二芹血、幾個(gè)重要概念

1、ARM

ARM處理器楞慈,特點(diǎn)是體積小幔烛、低功耗、低成本囊蓝、高性能饿悬,所以幾乎所有手機(jī)處理器都基于ARM,在嵌入式系統(tǒng)中應(yīng)用廣泛聚霜。

2狡恬、ARM處理器指令集

armv6|armv7|armv7s|arm64都是ARM處理器的指令集珠叔,這些指令集都是向下兼容的,例如armv7指令集兼容armv6傲宜,只是使用armv6的時(shí)候無法發(fā)揮出其性能运杭,無法使用armv7的新特性,從而會導(dǎo)致程序執(zhí)行效率沒那么高函卒。

還有兩個(gè)我們也很熟悉的指令集:i386|x86_64 是Mac處理器的指令集辆憔,i386是針對intel通用微處理器32架構(gòu)的。x86_64是針對x86架構(gòu)的64位處理器报嵌。所以當(dāng)使用iOS模擬器的時(shí)候會遇到i386|x86_64虱咧,iOS模擬器沒有arm指令集。

3锚国、目前iOS移動設(shè)備指令集

arm64:iPhone5S| iPad Air| iPad mini2(iPad mini with Retina Display)

armv7s:iPhone5|iPhone5C|iPad4(iPad with Retina Display)

armv7:iPhone3GS|iPhone4|iPhone4S|iPad|iPad2|iPad3(The New iPad)|iPad mini|iPod Touch 3G|iPod Touch4

armv6 設(shè)備: iPhone, iPhone2, iPhone3G, 第一代腕巡、第二代 iPod Touch(一般不需要去支持)

4、Xcode中指令集相關(guān)選項(xiàng)(Build Setting中)

(1)Architectures

Space-separated list of identifiers. Specifies the architectures (ABIs, processor models) to which the binary is targeted. When this build setting specifies more than one architecture, the generated binary may contain object code for each of the specified architectures.

指定工程被編譯成可支持哪些指令集類型血筑,而支持的指令集越多绘沉,就會編譯出包含多個(gè)指令集代碼的數(shù)據(jù)包,對應(yīng)生成二進(jìn)制包就越大豺总,也就是ipa包會變大车伞。

(2)Valid Architectures

Space-separated list of identifiers. Specifies the architectures for which the binary may be built. During the build, this list is intersected with the value of ARCHS build setting; the resulting list specifies the architectures the binary can run on. If the resulting architecture list is empty, the target generates no binary.

限制可能被支持的指令集的范圍,也就是Xcode編譯出來的二進(jìn)制包類型最終從這些類型產(chǎn)生喻喳,而編譯出哪種指令集的包另玖,將由Architectures與Valid Architectures(因此這個(gè)不能為空)的交集來確定,例如:

比如表伦,你的Valid Architectures設(shè)置的支持arm指令集版本有:armv7/armv7s/arm64谦去,對應(yīng)的Architectures設(shè)置的支持arm指令集版本有:armv7s,這時(shí)Xcode只會生成一個(gè)armv7s指令集的二進(jìn)制包蹦哼。

再比如:將Architectures支持arm指令集設(shè)置為:armv7,armv7s鳄哭,對應(yīng)的Valid Architectures的支持的指令集設(shè)置為:armv7s,arm64,那么此時(shí)纲熏,XCode生成二進(jìn)制包所支持的指令集只有armv7s

在Xcode6.1.1里的 Valid Architectures設(shè)置里妆丘, 默認(rèn)為 Standard architectures(armv7,arm64),如果你想改的話,自己在other中更改赤套。

原因解釋如下:

使用 standard architectures (including 64-bit)(armv7,arm64) 參數(shù)飘痛,則打的包里面有32位、64位兩份代碼容握,在iPhone5s( iPhone5s的cpu是64位的 )下宣脉,會首選運(yùn)行64位代碼包, 其余的iPhone( 其余iPhone都是32位的,iPhone5c也是32位 )剔氏,只能運(yùn)行32位包塑猖,但是包含兩種架構(gòu)的代碼包竹祷,只有運(yùn)行在ios6,ios7系統(tǒng)上羊苟。

這也就是說塑陵,這種打包方式,對手機(jī)幾乎沒要求蜡励,但是對系統(tǒng)有要求令花,即ios6以上。

而使用 standard architectures (armv7,armv7s) 參數(shù)凉倚, 則打的包里只有32位代碼兼都, iPhone5s的cpu是64位,但是可以兼容32位代碼稽寒,即可以運(yùn)行32位代碼扮碧。但是這會降低iPhone5s的性能。 其余的iPhone對32位代碼包更沒問題杏糙, 而32位代碼包慎王,對系統(tǒng)也幾乎也沒什么限制。

所以總結(jié)如下:

要發(fā)揮iPhone5s的64位性能宏侍,就要包含64位包赖淤,那么系統(tǒng)最低要求為ios6。 如果要兼容ios5以及更低的系統(tǒng)负芋,只能打32位的包漫蛔,系統(tǒng)都能通用嗜愈,但是會喪失iPhone5s的性能旧蛾。

(3)Build Active Architecture Only

指定是否只對當(dāng)前連接設(shè)備所支持的指令集編譯

當(dāng)其值設(shè)置為YES,這個(gè)屬性設(shè)置為yes蠕嫁,是為了debug的時(shí)候編譯速度更快锨天,它只編譯當(dāng)前的architecture版本,而設(shè)置為no時(shí)剃毒,會編譯所有的版本病袄。 編譯出的版本是向下兼容的,連接的設(shè)備的指令集匹配是由高到低(arm64 > armv7s > armv7)依次匹配的赘阀。比如你設(shè)置此值為yes益缠,用iphone4編譯出來的是armv7版本的,iphone5也可以運(yùn)行基公,但是armv6的設(shè)備就不能運(yùn)行幅慌。所以,一般debug的時(shí)候可以選擇設(shè)置為yes轰豆,release的時(shí)候要改為no胰伍,以適應(yīng)不同設(shè)備齿诞。

1) Architectures:armv7, armv7s, arm64

? ? ? ?ValidArchitectures:armv6, armv7s, arm64

? ? ? ?生成二進(jìn)制包支持的指令集: arm64

2)Architectures: armv6, armv7, armv7s

? ? ? Valid Architectures:armv6, armv7s, arm64

? ? ? 生成二進(jìn)制包支持的指令集: armv7s

3)Architectures: armv7, armv7s, arm64

? ? ?Valid Architectures: armv7,armv7s

? ? ?這種情況是報(bào)錯(cuò)的骂租,因?yàn)樵试S使用指令集中沒有arm64祷杈。

注:如果你對ipa安裝包大小有要求,可以減少安裝包的指令集的數(shù)量渗饮,這樣就可以盡可能的減少包的大小但汞。當(dāng)然這樣做會使部分設(shè)備出現(xiàn)性能損失,當(dāng)然在普通應(yīng)用中這點(diǎn)體現(xiàn)幾乎感覺不到互站,至少不會威脅到用戶體檢特占。

三、制作靜態(tài)庫.a是指令集選擇

現(xiàn)在回歸到正題云茸,如何制作一個(gè)“沒有問題”的.a靜態(tài)庫是目,通過以上信息了解到,當(dāng)我們做App的時(shí)候标捺,為了追求高效率懊纳,并且減小包的大小,Build Active Architecture Only設(shè)置成YES亡容,Architectures按Xcode默認(rèn)配置就可以嗤疯,因?yàn)閍rm64向前兼容。但制作.a靜態(tài)庫就不同了闺兢,因?yàn)橐WC兼容性茂缚,包括不同iOS設(shè)備以及模擬器運(yùn)行不出錯(cuò),所以結(jié)合當(dāng)前行業(yè)情況屋谭,要做到最大的兼容性脚囊。

ValidArchitectures設(shè)置為:armv7|armv7s|arm64|i386|x86_64

Architectures設(shè)置不變(或根據(jù)你需要):armv7|arm64

然后分別選擇iOS設(shè)備和模擬器進(jìn)行編譯,最后找到相關(guān)的.a進(jìn)行合包桐磁,使用lipo -create 真機(jī)庫.a的路徑 模擬器庫.a的的路徑 -output 合成庫的名字.a悔耘!這樣就制作了一個(gè)通用的靜態(tài)庫.a


注意:以上來自大神博客 http://blog.csdn.net/lizhongfu2013/article/details/42387311


下面我們來動手制作一個(gè)通用的靜態(tài)庫.a來(xcode8版本)

新建一個(gè)Project,選擇“Cocoa Touch Static Library”,點(diǎn)擊Next

圖一

這里我們將工程名命名為StaticLibrary我擂,完成之后我們會得到了一個(gè)靜態(tài)庫工程

圖二

我們看到衬以,工程中自動初始了與工程同名的點(diǎn)兩個(gè).h和.m文件,并默認(rèn)將StaticLibrary.h作為接口文件暴露給外部使用校摩。由于重點(diǎn)是制作.a文件看峻,這里我們在StaticLibrary.h添加一個(gè)簡單的方法,并在StaticLibrary.m里面去實(shí)現(xiàn)它

.h文件

@interface StaticLibrary :NSObject

+ (void)helloWorld;

@end

.m文件

#import"StaticLibrary.h"

@implementation StaticLibrary

+ (void)helloWorld {

? ? ?NSLog(@"hello, world !");

}

@end

然后衙吩,在buildingSettings選項(xiàng)卡里面將“Build Active Architecture Only”設(shè)置為NO互妓,并在“Valid Architecture”添加i386、x86_64選項(xiàng)

圖三

然后選擇一個(gè)模擬器,按“command+B”進(jìn)行編譯

成功之后车猬,products文件夾下的libStaticLibrary.a文本顏色會由紅變黑

圖四

選中l(wèi)ibStaticLibrary.a后點(diǎn)擊右鍵霉猛,選擇“Show in Finder”,你會看到文件libStaticLibrary.a和include文件夾,include文件夾里面包含有接口文件StaticLibrary.h珠闰。

使用lipo -info libStaticLibrary.a命令查看libStaticLibrary.a文件信息

圖五

我們已經(jīng)得到了一個(gè)可以在模擬器上使用的.a文件了惜浅!干得不錯(cuò)!

下面伏嗜,再來制作在真機(jī)上使用的

在Build Setting選項(xiàng)卡的“Architectures”里面添加“armv7s”

圖六

選擇真機(jī)“Generic iOS Device”坛悉,再“command+B”一次,成功之后取出點(diǎn)a承绸,同樣使用

lipo -info libStaticLibrary.a查看文件信息

圖七

干得不錯(cuò)裸影!適用真機(jī)的.a文件也有了!

下面就把它們合并起來了军熏!

lipo -create /Users/你的電腦名/Desktop/模擬器/libStaticLibrary.a /Users/你的電腦名/Desktop/真機(jī)/libStaticLibrary.a -output /Users/你的電腦名/Desktop/libStaticLibrary.a

成功之后轩猩,通過lipo -info 命令查看合并后的libStaticLibrary.a文件信息

圖八

好,大功告成荡澎!

接下來均践,就把可以我們制作好的libStaticLibrary.a和接口文件StaticLibrary.h引入到別的工程里面去用了,模擬器和真機(jī)都可以摩幔,再也不用擔(dān)心會報(bào)錯(cuò)了彤委!

圖九

這個(gè)時(shí)候,看到hello或衡,world !焦影,感覺太爽了!

最后編輯于
?著作權(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)容