參考文章
ARM
ARM架構谜疤,是一種低成本费尽、高性能、低耗電處理器架構离咐,目前廣泛的在移動通信領域中使用。
ARM處理器指令集
32位ARM指令集(armv6|armv7|armv7s)和64位ARM指令集(arm64)奉件。
i386|x86_64 是Mac處理器的指令集宵蛀,i386是針對intel通用微處理器32架構的。x86_64是針對x86架構的64位處理器县貌。
當使用iOS模擬器的時候會遇到i386|x86_64术陶,iOS模擬器沒有arm指令集。
iOS移動設備指令集
從這個表來說煤痕,指令集是向下兼容的梧宫,如果只添加了armv7,那么在armv7s 和arm64的機器上也是可以運行的摆碉;如果只添加armv7s塘匣,在arm64的機器上也能運行;只是不能發(fā)揮該機器的所有性能兆解。
指令集 | 對應機型 |
---|---|
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 |
armv8/arm64 | iPhone 6s(Plus), iPhone 6(Plus), iPhone 5s, iPad Air(2), Retina iPad Mini(2,3) 馆铁,7,7P锅睛,8埠巨,8P历谍,X |
“Build Setting” 中Architecture詳解
-
Architectures
指定工程支持的指令集的集合,如果設置多個architecture辣垒,則生成的二進制數(shù)據(jù)包會包含多個指令集代碼望侈,體積會變大。
-
Valid Architectures
有效的指令集集合勋桶,Architectures與Valid Architectures 的交集來確定最終的數(shù)據(jù)包包含的指令集代碼脱衙。
Xcode9.1創(chuàng)建的工程,Valid Architectures默認有這幾個:armv7 armv7s arm64
-
Build Active Architecture Only
指定是否只對當前連接設備所支持的指令集編譯例驹,默認Debug的時候設置為YES捐韩,Release的時候設置為NO。設置為YES是只編譯當前的architecture版本鹃锈,生成的包只包含當前連接設備的指令集代碼荤胁。設置為NO,則生成的包包含所有的指令集代碼(上面的Valid Architectures跟Architectures的交集)屎债。因此為了調(diào)試速度更快仅政,則Debug應該設置為YES。
特殊:設置此值為YES盆驹,如果連接的設備是arm64的( iPhone 5s圆丹,iPhone6(plus)等),則Valid Architecture 中必須包含arm64, 否則編譯會報錯(報錯內(nèi)容如下圖)躯喇。
工程中Architectures默認是這樣子的,那這個表示包含那幾個指令集呢:
具體步驟如下:
-
步驟一:
-
步驟二:
因此可以得出結論秸讹,Architectures(工程支持的指令集合)默認的為armv7和arm64。對比上面指令集的表格雅倒,Architectures 和Valid Architectures這兩個該如何設置璃诀,相信已經(jīng)很簡單了吧!如果Valid Architectures添加:armv7 armv7s arm64 , Architectures中保持默認蔑匣,那最終編譯得到的framework是支持armv7和arm64(交集)
App適配64位
導入靜態(tài)庫劣欢,報錯:ld: symbol(s) not found for architecture arm64
例如這樣:
可能原因:
1、靜態(tài)庫不包含該報錯的類裁良。
2凿将、靜態(tài)庫沒有鏈接到應用
3、靜態(tài)庫不支持64位价脾。
對應解決辦法:
1牧抵、如果是自己打包的靜態(tài)庫,可以查看靜態(tài)庫是否包含這個文件,具體方法是打開靜態(tài)庫源代碼犀变,查看Bulid Phases -> Compile Sources ->是否包含該文件妹孙。如果是別人的靜態(tài)庫,就得找那個人了获枝。(做項目的時候蠢正,發(fā)現(xiàn)Xcode9.0是有bug的,直接拖入工程的文件省店,不會自動添加到Compile Sources中嚣崭,內(nèi)部創(chuàng)建的文件,有時候也不能自動添加懦傍,這時候就需要手動添加了雹舀。)
2粗俱、打開自己的引用到該靜態(tài)庫的工程葱跋,查看Bulid Phases ->Link Binary With Libraries ->查看該靜態(tài)庫是否已經(jīng)導入
3、查看靜態(tài)庫是否支持64位源梭,如果是自己的靜態(tài)庫,可以查看是否添加arm64稍味,如果是別人的废麻,找那個人就是了,打他模庐。