今天在運行一個老ios項目的時候,突然報錯:No architectures to compile for (ONLY_ACTIVE_ARCH=YES, active arch=x86_64, VALID_ARCHS=i386),
網上搜了一下資料,有多種方法,但有些沒有用,后來終於找到了一種方法,解決了這個問題,現把步驟記錄一下:
1、在Project target里“Architectures”設置為“Standard (armv7,armv7s)” ;
2、修改在Project target里“Build Settings”的“Valid Architectures”添加“i386”和“armv7”(Xcode4.6 以上版本不再支持armv6,請去掉);
3、設置”Build Active Architecture Only”為“NO”。
這樣你build你的項目的時候就能在iphoe5和iphoe4s里執行。
然后對於Architectures、armv7等是什么東東,不懂,再去查了寫資料:
Architectures:這是指你想支持的指令集,比如:armv7,armv7s,或者可以用$(ARCHS_STANDARD_32_BIT)這樣的參數
Valid Architectures:這是指你即將編譯的指令集
Build Active Architecture Only:是否只編譯當前設備適用的指令集(如果這個參數設為YES,那么如果你用iPhone 6調試,最終生成的一個支持arm64指令集的Binary;如果你用iPhone4編譯,最終生成一個支持armv7指令集的Binary,所以一般在DEBUG模式下設為YES,RELEASE設為NO)
ARM是微處理器行業的一家知名企業,arm處理器以體積小和高性能的優勢在嵌入式設備中廣泛使用,幾乎所有手機都是使用它的。
armv6, armv7, armv7s是ARM CPU的不同指令集,原則上是向下兼容的。如iPhone4S CPU支持armv7, 但它同時兼容armv6,只是使用armv6指令可能無法充分發揮它的特性。同理iPhone5 CPU支持armv7s,它雖然也兼容armv7,但是卻無法進行相關的優化。
如果在工程Build Setting的Architectures 中的“Build Active Architecture Only”選擇為YES,則即使你設置成armv7 , armv7s同時支持,也只會編譯對應指令集的包;若選擇NO,則編譯器會整合兩個指令集到一起,此時的包比較大,但是能在iPhone5上使用armv7s的優化,同時也能適配老的設備。一般都是Debug時“Build Active Architecture Only”選擇YES,用當前的架構看代碼邏輯是否有問題;而在Release時選擇NO,來適配不同的設備。
模擬器並不運行arm代碼,軟件會被編譯成x86可以運行的指令。所以生成靜態庫時都是會先生成兩個.a,一個是i386的用於在模擬器運行,另一個是在真實設備上運行的,然后再用命令將兩個.a合並成一個。
目前常見iOS設備的指令集:
ARMv8/ARM64: iPhone 6(Plus), iPhone 5s, iPad Air(2), Retina iPad Mini(2,3)
ARMv7s: iPhone 5, iPhone 5c, iPad 4
ARMv7: iPhone 3GS, iPhone 4, iPhone 4S, iPod 3G/4G/5G, iPad, iPad 2, iPad 3, iPad Mini
ARMv6: iPhone, iPhone 3G, iPod 1G/2G