ARM是微處理器行業的一家知名企業,arm處理器以體積小和高性能的優點在嵌入式設備中普遍使用,幾乎全部手機都是使用它的。html
armv6, armv7, armv7s是ARM CPU的不一樣指令集,原則上是向下兼容的。如iPhone4S CPU支持armv7, 但它同時兼容armv6,只是使用armv6指令可能沒法充分發揮它的特性。同理iPhone5 CPU支持armv7s,它雖然也兼容armv7,可是卻沒法進行相關的優化。架構
armv6設備:iPhone, iPhone2, iPhone 3G,第一代、第二代iPod Touch性能
armv7設備:iPhone 3GS, iPhone 4, iPhone 4S優化
iPad , iPad 2, the new iPadui
iPod Touch 3G, iPod Touch 4spa
armv7s設備:iPhone 5htm
只有在目標設備上,纔會執行設備對應的指令集。blog
若是在工程Build Setting的Architectures 中的「Build Active Architecture Only」選擇爲YES,則即便你設置成armv7 , armv7s同時支持,也只會編譯對應指令集的包;若選擇NO,則編譯器會整合兩個指令集到一塊兒,此時的包比較大,可是能在iPhone5上使用armv7s的優化,同時也能適配老的設備。通常都是Debug時「Build Active Architecture Only」選擇YES,用當前的架構看代碼邏輯是否有問題;而在Release時選擇NO,來適配不一樣的設備。get
此外,模擬器並不運行arm代碼,軟件會被編譯成x86能夠運行的指令。因此生成靜態庫時都是會先生成兩個.a,一個是i386的用於在模擬器運行,另外一個是在真實設備上運行的,而後再用命令將兩個.a合併成一個。編譯器
所以若是一些程序中使用的靜態庫不支持armv7s,而你的工程支持armv7s時,就會出現「xxxx does not contain a(n) armv7s slice:xxxxx for architecture armv7s"的編譯錯誤,想要解決這個問題,有兩個方法:
1.若是是開源的,可以找到源代碼,則能夠用源代碼從新打一個支持armv7s的libaray, 或者在工程中直接使用源代碼,而不是靜態庫。
2.若是不是開源的,要麼就坐等第三方庫的支持,要麼就暫時讓你的工程不支持armv7s。