天天看點

iOS CPU架構(ARM指令集)

簡述 ARM處理器,因其功耗低和尺寸小而聞名,幾乎所有的手機處理器都基于ARM,蘋果當然也不例外。

armv6、armv7、armv7s、arm64都是ARM處理器的指令集,所有指令集原則上都是向下相容的。 如 iPhone 4s的CPU預設指令集為armv7指令集,但它可以同時也相容armv6的指令集,隻是在使用armv6的時候無法充分發揮其性能(無法發揮armv7指令集中得新特性)。

iOS模拟器沒有運作ARM指令集,編譯運作的是x86指令集(或i386),是以隻有在iOS裝置上才會執行裝置對應ARM指令集。

裝置的CPU架構(指令集) 模拟器: 4s-5: i386 5s-6s Plus: x86_64

真機(iOS裝置): armv6: iPhone、iPhone 2、iPhone 3G、iPod Touch(第一代)、iPod Touch(第二代) armv7: iPhone 3Gs、iPhone 4、iPhone 4s、iPad、iPad 2 armv7s: iPhone 5、iPhone 5c (靜态庫隻要支援了armv7,就可以在armv7s的架構上運作) arm64(注:無armv64): iPhone 5s、iPhone 6、iPhone 6 Plus、iPhone 6s、iPhone 6s Plus、iPad Air、iPad Air2、iPad mini2、iPad mini3

Build Settings

iOS CPU架構(ARM指令集)

Architectures: 指明標明的Target要求被編譯生成的二進制包所支援的指令集,支援指令集是通過編譯生成對應的二進制資料包實作的。如果支援的指令集數目有多個,就會編譯出包含多個指令集代碼的資料包,進而造成最終編譯生成的包很大。

Valid Architectures: 指明可能支援的指令集并非Architectures清單中指明的指令集都會被支援,Valid Architectures限制可能被支援的指令集的範圍,即Valid Architectures 和 Architectures 清單的交集,才是Xcode最終生成二進制包所支援的指令集。 比如:将Architectures支援arm指令集設定為: armv7, armv7s,對應的Valid Architectures的支援的指令集設定為:armv7s,arm64,那麼此時Xcode生成二進制包所支援的指令集隻有armv7s。

Build Active Architecture Only: 指明是否隻編譯目前連接配接裝置所支援的指令集。

該選項起作用的條件有兩個,必須同時滿足才會起作用:

1. 其值設定為YES

2. Xcode成功連接配接調試裝置

假定我們将Build Active Architecture Only值設定為YES,同時Xcode連接配接上手機 iPhone 5s(比對指令集arm64)

1. 第一種情況

Architectures:  armv7, armv7s, arm64

ValidArchitectures:  armv6, armv7s, arm64

生成二進制包支援的指令集: arm64 

2. 第二種情況

Architectures: armv6, armv7, armv7s

Valid Architectures:  armv6, armv7s, arm64

生成二進制包支援的指令集: armv7s 

3. 第三種情況

Architectures:  armv6, armv7

Valid Architectures: armv6, armv7s, arm64

生成二進制包支援的指令集: armv7

4. 第四種情況

Architectures: armv6

Valid Architectures: armv6, armv7s, arm64

生成二進制包支援的指令集: 雖然編譯成功了,但是并沒有任何目标生成, 因為從XCode4.5開始,就不再支援armv6指令集,是以清單中寫了也是白寫。

5. 第五種情況

Architectures: armv7, armv7s, arm64

Valid Architectures: armv7,armv7s

生成二進制包支援的指令集: 編譯出錯資訊

No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=arm64, VALID_ARCHS=armv7 armv7s) 
           

可以看出:當Build Active Architecture Only起作用時:

連接配接的手機指令集比對是由高到低(arm64 > armv7s > armv7)依次比對的。

如連接配接手機為iPhone 5s,其預設指令集為arm64,若Architectures清單為armv7, armv7s,則會選取armv7s指令集為目标指令集,如果此時Valid Architectures清單中包含該指令集,則成功生成的二進制包隻支援armv7s指令集,若alid Architectures清單不包含此指令集,則編譯将會出錯:

No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=armv7s, VALID_ARCHS=armv7 arm64)
           

同樣的,若Architectures清單為armv7,則會選取armv7作為目标指令集,若Valid Architectures清單中包含了armv7指令集,則能夠成功生成二進制包,其支援的指令集隻有armv7,若Valid Architectures清單中不包含armv7,則編譯失敗。

建議:通常Debug模式設定值為Yes,Release模式設定為No。

資料整理自: 1. http://blog.csdn.net/wowxavi1/article/details/24335597

2. http://www.cocoachina.com/ios/20140915/9620.html

3. 微信公開-全面了解 iOS 靜态庫開發