iOS指令集總結(jié)及Xcode中Architectures的設(shè)置

參考文章

Xcode里面指令集設(shè)置的理解和總結(jié)

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.png
  • 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
  • 步驟二:


    步驟二.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

例如這樣:


報(bào)錯(cuò).png

可能原因:
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è)人就是了,打他。
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容