iOS開發(fā)~制作同時支持armv7,armv7s,arm64,i386,x86_64的靜態(tài)庫.a

轉(zhuǎn)載地址:http://www.cocoachina.com/cms/wap.php?action=article&id=19619
armv7,armv7s,arm64,i386,x86_64 詳解

一、概要

平時項目開發(fā)中,可能使用第三方提供的靜態(tài)庫.a蚁阳,如果.a提供方技術(shù)不成熟擎厢,使用的時候就會出現(xiàn)問題叹卷,例如:

在真機上編譯報錯:No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386).

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

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

二竿刁、幾個重要概念

1、ARM

ARM處理器较雕,特點是體積小碉哑、低功耗、低成本亮蒋、高性能扣典,所以幾乎所有手機處理器都基于ARM,在嵌入式系統(tǒng)中應用廣泛慎玖。

2激捏、ARM處理器指令集

armv6|armv7|armv7s|arm64都是ARM處理器的指令集,這些指令集都是向下兼容的凄吏,例如armv7指令集兼容armv6远舅,只是使用armv6的時候無法發(fā)揮出其性能,無法使用armv7的新特性痕钢,從而會導致程序執(zhí)行效率沒那么高图柏。

還有兩個我們也很熟悉的指令集:i386|x86_64 是Mac處理器的指令集,i386是針對intel通用微處理器32架構(gòu)的任连。x86_64是針對x86架構(gòu)的64位處理器蚤吹。所以當使用iOS模擬器的時候會遇到i386|x86_64,ios模擬器沒有arm指令集随抠。

3裁着、目前iOS移動設備指令集

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 設備: iPhone, iPhone2, iPhone3G, 第一代、第二代 iPod Touch(一般不需要去支持)

4拱她、Xcode中指令集相關(guān)選項(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.

指定工程被編譯成可支持哪些指令集類型二驰,而支持的指令集越多,就會編譯出包含多個指令集代碼的數(shù)據(jù)包秉沼,對應生成二進制包就越大桶雀,也就是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編譯出來的二進制包類型最終從這些類型產(chǎn)生矗积,而編譯出哪種指令集的包,將由Architectures與Valid Architectures(因此這個不能為空)的交集來確定敞咧,例如:

比如棘捣,你的Valid Architectures設置的支持arm指令集版本有:armv7/armv7s/arm64,對應的Architectures設置的支持arm指令集版本有:armv7s休建,這時Xcode只會生成一個armv7s指令集的二進制包乍恐。

再比如:將Architectures支持arm指令集設置為:armv7,armv7s评疗,對應的Valid Architectures的支持的指令集設置為:armv7s,arm64,那么此時禁熏,XCode生成二進制包所支持的指令集只有armv7s

在Xcode6.1.1里的 Valid Architectures 設置里壤巷, 默認為 Standard architectures(armv7,arm64),如果你想改的話邑彪,自己在other中更改瞧毙。

原因解釋如下:

使用 standard architectures (including 64-bit)(armv7,arm64) 參數(shù),則打的包里面有32位寄症、64位兩份代碼宙彪,在iPhone5s( iPhone5s的cpu是64位的 )下,會首選運行64位代碼包有巧, 其余的iPhone( 其余iPhone都是32位的,iPhone5c也是32位 )释漆,只能運行32位包,但是包含兩種架構(gòu)的代碼包篮迎,只有運行在ios6男图,ios7系統(tǒng)上。

這也就是說甜橱,這種打包方式逊笆,對手機幾乎沒要求,但是對系統(tǒng)有要求岂傲,即ios6以上难裆。

而使用 standard architectures (armv7,armv7s) 參數(shù), 則打的包里只有32位代碼镊掖, iPhone5s的cpu是64位乃戈,但是可以兼容32位代碼,即可以運行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

指定是否只對當前連接設備所支持的指令集編譯

當其值設置為YES诅炉,這個屬性設置為yes蜡歹,是為了debug的時候編譯速度更快屋厘,它只編譯當前的architecture版本,而設置為no時月而,會編譯所有的版本汗洒。 編譯出的版本是向下兼容的,連接的設備的指令集匹配是由高到低(arm64 > armv7s > armv7)依次匹配的父款。比如你設置此值為yes溢谤,用iphone4編譯出來的是armv7版本的,iphone5也可以運行憨攒,但是armv6的設備就不能運行世杀。 所以,一般debug的時候可以選擇設置為yes肝集,release的時候要改為no瞻坝,以適應不同設備。

1)

Architectures: armv7, armv7s, arm64

ValidArchitectures: armv6, armv7s, arm64

生成二進制包支持的指令集: arm64

2)

Architectures: armv6, armv7, armv7s

Valid Architectures: armv6, armv7s, arm64

生成二進制包支持的指令集: armv7s

3)

Architectures: armv7, armv7s, arm64

Valid Architectures: armv7杏瞻,armv7s

這種情況是報錯的所刀,因為允許使用指令集中沒有arm64。

注:如果你對ipa安裝包大小有要求捞挥,可以減少安裝包的指令集的數(shù)量浮创,這樣就可以盡可能的減少包的大小。當然這樣做會使部分設備出現(xiàn)性能損失树肃,當然在普通應用中這點體現(xiàn)幾乎感覺不到蒸矛,至少不會威脅到用戶體檢崇棠。

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

現(xiàn)在回歸到正題,如何制作一個“沒有問題”的.a靜態(tài)庫兵多,通過以上信息了解到劣像,當我們做App的時候乡话,為了追求高效率,并且減小包的大小耳奕,Build Active Architecture Only設置成YES绑青,Architectures按Xcode默認配置就可以,因為arm64向前兼容屋群。但制作.a靜態(tài)庫就不同了闸婴,因為要保證兼容性,包括不同iOS設備以及模擬器運行不出錯芍躏,所以結(jié)合當前行業(yè)情況邪乍,要做到最大的兼容性。

ValidArchitectures設置為:armv7|armv7s|arm64|i386|x86_64

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

然后分別選擇iOS設備和模擬器進行編譯,最后找到相關(guān)的.a進行合包庇楞,使用lipo -create 真機庫.a的路徑 模擬器庫.a的的路徑 -output 合成庫的名字.a(詳情可以參考http://blog.csdn.NET/lizhongfu2013/article/details/12648633

這樣就制作了一個通用的靜態(tài)庫.a

.a 與 FrameWork 合并技巧

查看.a 和 FrameWork 的適配機型

lipo -create Debug-iphoneos/libMJRefresh.a Debug-iphonesimulator/libMJRefresh.a -output libMJRefresh.a

lipo -create /Users/harvey/Library/Developer/Xcode/DerivedData/FMDB-ctegiztcjikewoeprxxtmryzetfa/Build/Products/Release-iphoneos/libFMDB.a /Users/harvey/Library/Developer/Xcode/DerivedData/FMDB-ctegiztcjikewoeprxxtmryzetfa/Build/Products/Release-iphonesimulator/libFMDB.a -output /Users/harvey/Desktop/libFMDB.a

lipo -create /Users/harvey/Library/Developer/Xcode/DerivedData/FMDB-clvayfrjgytqrbdkyqrtcjkxfeuz/Build/Products/Release-iphonesimulator/FMDB.framework/FMDB /Users/harvey/Library/Developer/Xcode/DerivedData/FMDB-clvayfrjgytqrbdkyqrtcjkxfeuz/Build/Products/Release-iphoneos/Release-iphoneos.framework/FMDB -output /Users/harvey/Desktop/FMDB

Architectures in the fat file: /Users/kunkkaqi/Desktop/TestFrameWork.framework/TestFrameWork.lipo are: i386 armv7 armv7s x86_64 arm64

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末榜配,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子吕晌,更是在濱河造成了極大的恐慌蛋褥,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件睛驳,死亡現(xiàn)場離奇詭異烙心,居然都是意外死亡,警方通過查閱死者的電腦和手機柏靶,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門弃理,熙熙樓的掌柜王于貴愁眉苦臉地迎上來溃论,“玉大人屎蜓,你說我怎么就攤上這事≡垦” “怎么了炬转?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長算灸。 經(jīng)常有香客問我扼劈,道長,這世上最難降的妖魔是什么菲驴? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任荐吵,我火速辦了婚禮,結(jié)果婚禮上赊瞬,老公的妹妹穿的比我還像新娘先煎。我一直安慰自己,他們只是感情好巧涧,可當我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布薯蝎。 她就那樣靜靜地躺著,像睡著了一般谤绳。 火紅的嫁衣襯著肌膚如雪占锯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天缩筛,我揣著相機與錄音消略,去河邊找鬼。 笑死瞎抛,一個胖子當著我的面吹牛艺演,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼钞艇,長吁一口氣:“原來是場噩夢啊……” “哼啄寡!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起哩照,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤挺物,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后飘弧,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體识藤,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年次伶,在試婚紗的時候發(fā)現(xiàn)自己被綠了痴昧。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡冠王,死狀恐怖赶撰,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情柱彻,我是刑警寧澤豪娜,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站哟楷,受9級特大地震影響瘤载,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜卖擅,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一鸣奔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惩阶,春花似錦挎狸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至脐嫂,卻和暖如春统刮,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背账千。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工侥蒙, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人匀奏。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓鞭衩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子论衍,可洞房花燭夜當晚...
    茶點故事閱讀 42,786評論 2 345

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