1. 程式人生 > >armv6, armv7, armv7s, arm64 的區別

armv6, armv7, armv7s, arm64 的區別

這兩天遇到靜態庫不支援armv7s的問題,所以順道瞭解和總結一下幾個arm架構的一些基本區別。

ARM是微處理器行業的一家知名企業,arm處理器以體積小和高效能的優勢在嵌入式裝置中廣泛使用,幾乎所有手機都是使用它的。

armv6, armv7, armv7s, arm64 是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 iPad

                    iPod Touch 3G, iPod Touch 4

armv7s裝置:iPhone 5 iphone 5c

arm64裝置:iPhone 5s iphone 6 iphone 6s

只有在目標裝置上,才會執行裝置對應的指令集。

如果在工程Build Setting的Architectures 中的“Build Active Architecture Only”

選擇為YES,則即使你設定成armv7 , armv7s同時支援,也只會編譯對應指令集的包;若選擇NO,則編譯器會整合兩個指令集到一起,此時的包比較大,但是能在iPhone5上使用armv7s的優化,同時也能適配老的裝置。一般都是Debug時“Build Active Architecture Only”選擇YES,用當前的架構看程式碼邏輯是否有問題;而在Release時選擇NO,來適配不同的裝置。

此外,模擬器並不執行arm程式碼,軟體會被編譯成x86可以執行的指令。所以生成靜態庫時都是會先生成兩個.a,一個是i386的用於在模擬器執行,另一個是在真實裝置上執行的,然後再用命令將兩個.a合併成一個。

因此如果一些程式中使用的靜態庫不支援armv7s,而你的工程支援armv7s時,就會出現“xxxx does not contain a(n) armv7s slice:xxxxx for architecture armv7s"的編譯錯誤,想要解決這個問題,有兩個方法:

1.如果是開源的,能夠找到原始碼,則可以用原始碼重新打一個支援armv7s的libaray, 或者在工程中直接使用原始碼,而不是靜態庫。

2.如果不是開源的,要麼就坐等第三方庫的支援,要麼就暫時讓你的工程不支援armv7s。