1. 程式人生 > >關於iOS開發CPU架構的問題

關於iOS開發CPU架構的問題

首先,之所以提到CPU架構的問題,其實是因為我們iOS開發使用的靜態庫與動態庫與之緊密相連。每一個開發的App都要執行在模擬器或者真機上,在編譯的時候,Xcode需要去分析當前執行平臺的CPU架構,然後確定所使用的靜態庫是否支援這個CPU架構。如果不支援就會報錯。

一、什麼是CPU架構

“CPU架構是CPU廠商給屬於同一系列的CPU產品定的一個規範,主要目的是為了區分不同型別CPU的重要標示。目前市面上的CPU分類主要分有兩大陣營,一個是intel、AMD為首的複雜指令集CPU,另一個是以IBM、ARM為首的精簡指令集CPU。兩個不同品牌的CPU,其產品的架構也不相同,例如,Intel、AMD的CPU是X86架構的,而IBM公司的CPU是PowerPC架構,ARM公司是ARM架構”(摘自百度)
通常,我們知道電腦的CPU架構有X86和X64等,但是手機的主流CPU架構是ARM架構,因為採用ARM架構的CPU是一種微處理器,這種處理器功耗低,體積小,更適合手機使用,iPhone的CPU也是如此。

二、iPhone移動裝置預設指令集

那麼,總結iPhone裝置預設指令集的使用情況如下:
螢幕快照 2016-11-08 下午1.57.51.png

三、有關指令集使用特點

  1. 上述arm處理器指令集,在原則上它們都是向下相容的。比如iPhone6s的CPU預設指令集是arm64,但是也同時支援armv7s等以前版本的指令集,只是效率變低了而已。
  2. xcode模擬器其實是在電腦上的,所以iOS模擬器並沒有使用arm指令集。它編譯執行使用的是x86指令集(或者i386)。而在真機上使用的才是arm型別的指令集。
  3. 在Xcode中設定二進位制包所支援的指令集,對於編譯後的二進位制包的大小影響顯著,設定支援的指令集個數越少,安裝包也越小。

四、Xcode中關於指令集的配置與使用

具體在Xcode中的使用,我們在Xcode中選擇將要設定的target,然後開啟build setting, 可以看到有關指令集設定的Architectures選項。

螢幕快照 2016-11-08 下午1.59.51.png
在這裡的關鍵設定有三個,可以通過這裡設定Xcode生成二進位制包的指令集

1.Architectures:

作用:設定工程被編譯後將支援哪些指令集,支援指令集是通過編譯生成對應的二進位制資料包實現的。
特點:設定支援的指令集資料越多,編譯出的二進位制包包含的指令集程式碼越多,這樣就會使最後編譯的包很大。

2.valid Architectures:

作用:設定可能支援的指令集,這裡的指令集選項和Architectures列表中指令集選項的交集,將決定最後Xcode生成二進位制包所支援的指令集。
舉例:Architectures支援armv7, Valid Architecture支援armv7、armv7s、armv64,那麼Xcode只會生成一個armv7指令集的二進位制包。

3.build Active Architecture only

作用:設定是否只編譯當前使用裝置所對應的arm指令集。也就是說當該項設定為YES的時候,上述規則(Architectures和valid Architectures交集決定二進位制包所支援指令集)將被打破。
舉列:設定該選項是YES,並且連線一個armv7指令集裝置,無論前面兩項如何設定,Xcode最終生成armv7指令集的二進位制包。不過設定為YES生效有個前提條件就是,Xcode必須成功連線了除錯的裝置。

注意:

一般的情況下,build Active Architecture only選項預設在Debug模式下是YES, Release模式下是NO,但是我們在開發的時候,有時候也會遇到一些第三方檔案找不到路徑的問題,這時要求我們設定Debug模式下也為NO。

五、遇到的問題

在這裡記錄一個在開發中遇到的問題。曾經在使用CocoaPods管理第三方的時候,遇到了“library not found for -lXXX”的錯誤,當時使用了Masonry的庫。Xcode報錯如下:
螢幕快照 2016-11-08 下午2.25.33.png
其實這是因為CocoaPods在引入第三方類庫的時候,預設build Active Architecture only在Debug模式下是YES導致的,修改為NO就可以了