iOS 中的 armv7,armv7s,arm64,i386,x86_64 都是什么
Undefined symbols for architecture arm64解決方案
iOS CPU架構(gòu)(ARM指令集)
前言
OS 中的 armv7,armv7s,arm64,i386,x86_64 這些都代表什么哨啃?在Xcode中如何選擇
介紹
- armv7|armv7s|arm64都是ARM處理器的指令集
- i386|x86_64 是Mac處理器的指令集
這些指令集在那些設(shè)備中有用到呢攒磨?
arm64:iPhone6s | iphone6s plus|iPhone6| iPhone6 plus|iPhone5S | iPad Air| iPad mini2(iPad mini with Retina Display)
armv7s:iPhone5|iPhone5C|iPad4(iPad with Retina Display)
armv7:iPhone4|iPhone4S|iPad|iPad2|iPad3(The New iPad)|iPad mini|iPod Touch 3G|iPod Touch4
i386是針對intel通用微處理器32位處理器
x86_64是針對x86架構(gòu)的64位處理器
模擬器32位處理器測試需要i386架構(gòu),
模擬器64位處理器測試需要x86_64架構(gòu),
真機(jī)32位處理器需要armv7,或者armv7s架構(gòu),
真機(jī)64位處理器需要arm64架構(gòu)琐簇。
在實際開發(fā)中的選擇問題
Xcode中指令集相關(guān)選項(Build Setting中)
Architectures
指定工程被編譯成可支持哪些指令集類型均函,而支持的指令集越多升熊,就會編譯出包含多個指令集代碼的數(shù)據(jù)包沃于,對應(yīng)生成二進(jìn)制包就越大涩咖,也就是ipa包會變大赶袄。Valid Architectures
限制可能被支持的指令集的范圍,也就是Xcode編譯出來的二進(jìn)制包類型最終從這些類型產(chǎn)生抠藕,<b>而編譯出哪種指令集的包,將由Architectures與Valid Architectures(因此這個不能為空)的交集來確定</b>Build Active Architecture Only
指定是否只對當(dāng)前連接設(shè)備所支持的指令集編譯
當(dāng)其值設(shè)置為YES蒋困,這個屬性設(shè)置為yes盾似,是為了debug的時候編譯速度更快,它只編譯當(dāng)前的architecture版本雪标,而設(shè)置為no時零院,會編譯所有的版本。 所以村刨,一般debug的時候可以選擇設(shè)置為yes告抄,release的時候要改為no,以適應(yīng)不同設(shè)備嵌牺。
舉例
<b>比如</b> Valid Architectures設(shè)置的支持arm指令集版本有:armv7/armv7s/arm64打洼,對應(yīng)的Architectures設(shè)置的支持arm指令集版本有:armv7s,這時Xcode只會生成一個armv7s指令集的二進(jìn)制包逆粹。
<b>再比如</b>:將Architectures支持arm指令集設(shè)置為:armv7,armv7s募疮,對應(yīng)的Valid Architectures的支持的指令集設(shè)置為:armv7s,arm64,那么此時僻弹,XCode生成二進(jìn)制包所支持的指令集只有armv7s
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以上的系統(tǒng)上。
而使用 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的性能。
當(dāng)然這樣做會使部分設(shè)備出現(xiàn)性能損失绿渣,當(dāng)然在普通應(yīng)用中這點體現(xiàn)幾乎感覺不到朝群,至少不會威脅到用戶體檢。
怎樣判擔(dān).a 靜態(tài)文件支持的指令集有哪些中符?
//使用lipo -info 命令行
lipo -info libogg.a
怎樣解決缺少指令集的問題姜胖?
編譯會出現(xiàn):某個靜態(tài)包不支持arm64 指令,那么淀散,可以lipo -info 看下支持哪些指令右莱。 然后百度這個靜態(tài)包,看看是不是需要哪些依賴庫