iOS 指令集架構 armv6、armv7、armv7s、arm64、x86_64、i386

來源:互聯網
上載者:User

標籤:成功   分享圖片   cisc   active   列表   key   產生   sdn   通用   

一、ARM架構

  ARM架構過去稱作進階精簡指令集機器(Advanced RISC Machine,更早稱作:Acorn RISC Machine),是一個32位精簡指令集(RISC)處理器架構,ARM處理器非常適用於移動通訊領域,符合其主要設計目標為低耗電的特性。

  ARM和Intel處理器的第一個區別是,前者使用精簡指令集(RISC),而後者使用複雜指令集(CISC)。

二、ARM處理器指令集

  ARM指令集是指電腦ARM操作指令系統。

  armv6、armv7、armv7s、arm64都是arm處理器的指令集,所有指令集原則上都是向下相容的。比如,你的裝置是armv7s指令集,那麼它也可以相容運行比armv7s版本低的指令集:armv7、armv6。Xcode4.5起不再支援armv6。

  蘋果A7處理器支援兩個不同的指令集:32位ARM指令集(armv6|armv7|armv7s)和64位ARM指令集(arm64)。
i386|x86_64 是Mac處理器的指令集。

  i386通常被用來作為對Intel 32位微處理器的統稱。X86-64可在同一時間內處理64位的整數運算,併兼容X86-32架構,x86_64是針對x86架構的64位處理器。當使用iOS模擬器的時候會遇到i386|x86_64,iOS模擬器沒有運行arm指令集,編譯啟動並執行是x86指令集,所以,只有在iOS裝置上,才會執行裝置對應的arm指令集。

三、iOS裝置支援的指令集

armv6:

  iPhone, iPhone 3G, iPod 1G/2G

armv7:

  iPhone 3GS, iPhone 4, iPhone 4S, iPod 3G/4G/5G, iPad, iPad 2, iPad 3, iPad Mini

armv7s:

   iPhone 5, iPhone 5c, iPad 4

arm64:

  iPhone X,iPhone 8(Plus),iPhone 7(Plus),iPhone 6(Plus),iPhone 6s(Plus), iPhone 5s, iPad Air(2), Retina iPad Mini(2,3)

四、Xcode->Build setting1. Architectures

  指定工程被編譯成支援哪些指令集類型,而支援的指令集越多,就會編譯出很多個指令集代碼的資料包,對應產生二進位包就越大,也就是ipa包越大。

  現在XCode->build setting 中Architectures的預設值是Standard architectures- $(ARCHS-STANDARD), $(ARCHS-STANDARD)的值如所示:

  地址:https://pewpewthespells.com/blog/buildsettings.html#current_arch

2、Valid Architectures

  該編譯項指定可能支援的指令集,該列表和Architectures列表的交集,將是Xcode最終產生二進位包所支援的指令集。

  比如,你的Valid Architectures設定的支援arm指令集版本有:armv7/armv7s/arm64,對應的Architectures設定的支援arm指令集版本有:arm64,這時Xcode只會產生一個arm64指令集的二進位包。

  減少安裝包中的指令集資料包可以減小打包ipa的大小。

3、Build Active Architecture Only:

  指明是否只編譯當前串連裝置所支援的指令集。

  預設Debug的時候設定為YES,Release的時候設定為NO。設定為YES是只編譯當前的architecture版本,產生的包只包含當前串連裝置的指令集代碼。設定為NO,則產生的包包含所有的指令集代碼(上面的Valid Architectures跟Architectures的交集)。因此為了調試速度更快,則Debug應該設定為YES。

  特殊:設定此值為YES,如果串連的裝置是arm64的( iPhone 5s,iPhone6(plus)等),則Valid Architecture 中必須包含arm64, 否則編譯會報錯(報錯的內容在下面常見問題中)。

五、常見錯誤  1. 編譯報錯 No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386).

  問題起因:active architecture(當前串連裝置的指令集)為64位指令集,但是valid architecture只包含32位指令集
  解決方案:valid architecture增加arm64 (常見的一些文章的解決方案是把Build Active Architecture Only設定為NO,這是個簡單粗暴的解決辦法,在Debug過程中也會產生包含所有指令集的代碼,更何況現在官方強制必須支援64位,故不建議採納)

  2. No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=i386, VALID_ARCHS=x86_64).

  問題起因:跟上個問題同理,只不過串連的裝置指令集是32位指令集,但是valid architecture只包含64位指令集

  解決辦法:valid architecture增加armv7

  3. 匯入靜態庫後編譯報錯為 

  問題起因:

  1:可能是靜態庫中不包含這個類。
  2:靜態庫工程可能沒有連結到應用。

  3:可能是因為靜態庫(.a)為真機版本,不包含模擬器版本(i386)。

  解決辦法:

  1:查看靜態庫裡面是否存在這個類。
  2:Build Phases中沒有添加Link Binary With Libraries 中添加此靜態庫。

  3:把偵錯目標換成真機 或者 匯入一個模擬器版本跟真機版本合并的版本

  同理如果匯入的庫是模擬器版本而用真機調試也會報錯,所以匯入一個通用的版本是目前來講最好的辦法。

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

  當Build Active Architecture Only起作用時:串連的手機指令集匹配是由高到低(arm64 > armv7s > armv7)依次匹配的。

  5、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,則編譯失敗。

 

 

參考:

http://www.cocoachina.com/industry/20140527/8566.html

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

http://blog.csdn.net/bendanzexiaohua/article/details/53303745

iOS 指令集架構 armv6、armv7、armv7s、arm64、x86_64、i386

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.