1、處理器指令集介紹
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指令集橡淑。
2、目前iOS移動設(shè)備指令集
arm64/armv8:iphone7+|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
模擬器32位處理器測試需要i386架構(gòu)
模擬器64位處理器測試需要x86_64架構(gòu)
真機32位處理器需要armv7,或者armv7s架構(gòu)
真機64位處理器需要arm64架構(gòu)
3梁棠、Xcode Build Setting中相關(guān)選項
(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ù)包男娄,對應(yīng)生成二進制包就越大,也就是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(因此這個不能為空)的交集來確定晾咪,eg:
Valid Architectures設(shè)置的支持arm指令集版本有:armv7/armv7s/arm64贮配,對應(yīng)的Architectures設(shè)置的支持arm指令集版本有:armv7s,這時Xcode只會生成一個armv7s指令集的二進制包泪勒。
將Architectures支持arm指令集設(shè)置為:armv7,armv7s,對應(yīng)的Valid Architectures的支持的指令集設(shè)置為:armv7s,arm64叼旋,那么此時沦辙,XCode生成二進制包所支持的指令集只有armv7s
(3)Build Active Architecture Only
指定是否只對當前連接設(shè)備所支持的指令集編譯
當其值設(shè)置為YES,這個屬性設(shè)置為yes油讯,是為了debug的時候編譯速度更快,它只編譯當前的architecture版本陌兑,而設(shè)置為no時,會編譯所有的版本饿凛。 編譯出的版本是向下兼容的软驰,連接的設(shè)備的指令集匹配是由高到低(arm64 > armv7s > armv7)依次匹配的。比如你設(shè)置此值為yes锭亏,用iphone4編譯出來的是armv7版本的,iphone5也可以運行贰镣,但是armv6的設(shè)備就不能運行膳凝。 所以,一般debug的時候可以選擇設(shè)置為yes上煤,release的時候要改為no,以適應(yīng)不同設(shè)備劫狠。
4、通過指令查看靜態(tài)庫支持的指令集
5呐矾、合并靜態(tài)庫
lipo -create 靜態(tài)庫路徑1 靜態(tài)庫2 -output 靜態(tài)庫路徑3