簡述 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
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 靜态庫開發