IOS 開發學習37 的Architecture與iphone版本對應關係
簡介
Arm是處理器是移動裝置上佔用率最大的處理器。
armv6、armv7、armv7s、arm64都是arm處理器的指令集。通常指令是向下相容的。在模擬器執行時,iOS模擬器執行的是x86指令集。只有在真機上,才會對執行arm指令集。
如果出現錯誤:
“OBJC_CLASS$_xx檔名”, referenced from:
linker command failed with exit code 1 (use -v to see invocation)
要設定:
Build Active Architecture Only
這個屬性設定為yes,是為了debug的時候編譯速度更快,它只編譯當前的architecture版本,所以會報錯編譯不到檔案,出錯(”OBJC_CLASS
而設定為no時,會編譯所有的版本。
裝置對應的architecture:
架構 | 版本 |
---|---|
armv6 | iPhone,iPhone 2G/3G, iPod 1G/2G |
armv7 | iPhone 3GS,iPhone4,iPhone 4s, iPad,iPad2,iPad3(The New iPad),iPad mini, iPod Touch 3G,iPod Touch4 |
armv7s | iPhone5, iPhone5C, iPad4, iPod5 |
arm64 | iPhone5s,iPhone6,iPhone6 Plus, iPad Air,iPad mini2(iPad mini with Retina Display) |
從XCode45開始,不再支援armv6指令集。
Xcode的Achitectures設定
Architectures:
選擇Target生成包所支援的指令集,則意味著生成的包裡面要包含對應的指令集程式碼。原則上選擇的Target多,會造成生成的包比較大。
Valid Architectures:
Valid Architectures限制可能被支援的指令集範圍。
生成的包裡,是Valid Architectures與Architectures的交集。
Build Active Architecture Only:
是否只編譯當前連線裝置所支援的指令集。
編譯生成的包裡支援的指令集,與上面的三個選項設定都有密切的關係。如:
現XCode連線New iPad(支援armv7)設定:
選項 | 值 |
---|---|
Build Active Architecture Only | YES |
Architectures | armv7 armv7s arm64 |
ValidArchitectures | armv7 armv7s arm64 |
這時生成包支援指令集 | armv7 |
如果是下面情況就會出現問題:
選項 | 值 |
---|---|
Build Active Architecture Only | YES |
Architectures | armv7 armv7s arm64 |
ValidArchitectures | armv6 armv7s arm64 |
這時生成包支援指令集 | 編譯報錯:No architectures to compile for… |
Build Active Architecture Only一般在Debug設為Yes,Release設定為No。
其它問題
xcode有時會提示:
Pods was rejected as an implicit dependency for ‘libPods.a’ because its architectures ‘XXX’ didn’t contain all required architectures ‘XXX’.
除了按上面的提示進行必要的分析設定,另外可以把Pods的Targets Architectures設定:
Build Active Architecture Only :No
嘗試一下。