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”
此外,模擬器並不執行arm程式碼,軟體會被編譯成x86可以執行的指令。所以生成靜態庫時都是會先生成兩個.a,一個是i386的用於在模擬器執行,另一個是在真實裝置上執行的,然後再用命令將兩個.a合併成一個。
因此如果一些程式中使用的靜態庫不支援armv7s,而你的工程支援armv7s時,就會出現“xxxx does not contain a(n) armv7s slice:xxxxx for architecture armv7s"的編譯錯誤,想要解決這個問題,有兩個方法:
1.如果是開源的,能夠找到原始碼,則可以用原始碼重新打一個支援armv7s的libaray, 或者在工程中直接使用原始碼,而不是靜態庫。
2.如果不是開源的,要麼就坐等第三方庫的支援,要麼就暫時讓你的工程不支援armv7s。