參考文章
ARM
ARM架構(gòu),是一種低成本、高性能、低耗電處理器架構(gòu),目前廣泛的在移動(dòng)通信領(lǐng)域中使用。
ARM處理器指令集
32位ARM指令集(armv6|armv7|armv7s)和64位ARM指令集(arm64)。
i386|x86_64 是Mac處理器的指令集,i386是針對intel通用微處理器32架構(gòu)的。x86_64是針對x86架構(gòu)的64位處理器。
當(dāng)使用iOS模擬器的時(shí)候會(huì)遇到i386|x86_64,iOS模擬器沒有arm指令集。
iOS移動(dòng)設(shè)備指令集
從這個(gè)表來說,指令集是向下兼容的,如果只添加了armv7,那么在armv7s 和arm64的機(jī)器上也是可以運(yùn)行的;如果只添加armv7s,在arm64的機(jī)器上也能運(yùn)行;只是不能發(fā)揮該機(jī)器的所有性能。
| 指令集 | 對應(yīng)機(jī)型 |
|---|---|
| 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
指定工程支持的指令集的集合,如果設(shè)置多個(gè)architecture,則生成的二進(jìn)制數(shù)據(jù)包會(huì)包含多個(gè)指令集代碼,體積會(huì)變大。
-
Valid Architectures
有效的指令集集合,Architectures與Valid Architectures 的交集來確定最終的數(shù)據(jù)包包含的指令集代碼。
Xcode9.1創(chuàng)建的工程,Valid Architectures默認(rèn)有這幾個(gè):armv7 armv7s arm64
-
Build Active Architecture Only
指定是否只對當(dāng)前連接設(shè)備所支持的指令集編譯,默認(rèn)Debug的時(shí)候設(shè)置為YES,Release的時(shí)候設(shè)置為NO。設(shè)置為YES是只編譯當(dāng)前的architecture版本,生成的包只包含當(dāng)前連接設(shè)備的指令集代碼。設(shè)置為NO,則生成的包包含所有的指令集代碼(上面的Valid Architectures跟Architectures的交集)。因此為了調(diào)試速度更快,則Debug應(yīng)該設(shè)置為YES。
特殊:設(shè)置此值為YES,如果連接的設(shè)備是arm64的( iPhone 5s,iPhone6(plus)等),則Valid Architecture 中必須包含arm64, 否則編譯會(huì)報(bào)錯(cuò)(報(bào)錯(cuò)內(nèi)容如下圖)。
當(dāng)前連接設(shè)備為6s,而Valid Architectures只添加了armv7和armv7s.png
工程中Architectures默認(rèn)是這樣子的,那這個(gè)表示包含那幾個(gè)指令集呢:

具體步驟如下:
-
步驟一:
步驟一.png -
步驟二:
步驟二.png
步驟二(1).png
因此可以得出結(jié)論,Architectures(工程支持的指令集合)默認(rèn)的為armv7和arm64。對比上面指令集的表格,Architectures 和Valid Architectures這兩個(gè)該如何設(shè)置,相信已經(jīng)很簡單了吧!如果Valid Architectures添加:armv7 armv7s arm64 , Architectures中保持默認(rèn),那最終編譯得到的framework是支持armv7和arm64(交集)
App適配64位
導(dǎo)入靜態(tài)庫,報(bào)錯(cuò):ld: symbol(s) not found for architecture arm64
例如這樣:

可能原因:
1、靜態(tài)庫不包含該報(bào)錯(cuò)的類。
2、靜態(tài)庫沒有鏈接到應(yīng)用
3、靜態(tài)庫不支持64位。
對應(yīng)解決辦法:
1、如果是自己打包的靜態(tài)庫,可以查看靜態(tài)庫是否包含這個(gè)文件,具體方法是打開靜態(tài)庫源代碼,查看Bulid Phases -> Compile Sources ->是否包含該文件。如果是別人的靜態(tài)庫,就得找那個(gè)人了。(做項(xiàng)目的時(shí)候,發(fā)現(xiàn)Xcode9.0是有bug的,直接拖入工程的文件,不會(huì)自動(dòng)添加到Compile Sources中,內(nèi)部創(chuàng)建的文件,有時(shí)候也不能自動(dòng)添加,這時(shí)候就需要手動(dòng)添加了。)
靜態(tài)庫源代碼中,文件是否存在和導(dǎo)入.png
2、打開自己的引用到該靜態(tài)庫的工程,查看Bulid Phases ->Link Binary With Libraries ->查看該靜態(tài)庫是否已經(jīng)導(dǎo)入
查看是否導(dǎo)入靜態(tài)庫.png
3、查看靜態(tài)庫是否支持64位,如果是自己的靜態(tài)庫,可以查看是否添加arm64,如果是別人的,找那個(gè)人就是了,打他。





