iOS指令集總結(jié)

指令集

通常會把CPU的擴(kuò)展指令集稱為”CPU的指令集”(因?yàn)榛镜模愃萍訙p的指令似乎是必須被CPU所支持的指令)。每款CPU在設(shè)計(jì)時(shí)就規(guī)定了一系列與其硬件電路相配合的指令集。

Arm處理器

Arm處理器,因?yàn)槠涞凸暮托〕叽缍劽瑤缀跛械氖謾C(jī)處理器都基于arm,其在嵌入式系統(tǒng)中的應(yīng)用非常廣泛,它的性能在同等功耗產(chǎn)品中也很出色。想了解ARM指令集的請點(diǎn)擊這里

iPhone指令集

蘋果A7處理器支持兩個(gè)不同的指令集: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í)候會遇到i386|x86_64,iOS模擬器沒有arm指令集。

不同型號的iPhone都使用的是什么指令集:

ARMv8-A = iPhone6s,iPhone6s Plus,iPad Air2,Apple TV4,iPad Air,iPhone6 ? ? ????

ARMv8/ARM64 = iPhone5s, iPad Air, Retina iPad MiniARMv7s = iPhone5, iPhone5c, iPad4

ARMv7? = iPhone3GS, iPhone4, iPhone4S, iPod3G/4G/5G, iPad, iPad2, iPad3, iPad Mini??

ARMv6? = iPhone, iPhone3G, iPod1G/2G


Xcode中關(guān)于生成二進(jìn)制包指令集相關(guān)的設(shè)置

主要有以下三個(gè):

Architectures

官方文檔說明:

Space-separated?list?of?identifiers.?Specifies?the?architectures?(ABIs,?processor?models)?to?which?the?binary?is?targeted.?When?this?build?setting?specifies?more?than?one?architecture,?the?generated?binary?may?contain?object?code?for?each?of?the?specified?architectures.

該編譯選項(xiàng)指定了工程將被編譯成支持哪些指令集,支持指令集是通過編譯生成對應(yīng)的二進(jìn)制數(shù)據(jù)包實(shí)現(xiàn)的,如果支持的指令集數(shù)目有多個(gè),就會編譯出包含多個(gè)指令集代碼的數(shù)據(jù)包,造成最終編譯的包很大。

Valid Architectures

官方文檔說明:

Space-separated?list?of?identifiers.?Specifies?the?architectures?for?which?the?binary?may?be?built.?During?the?build,?this?list?is?intersected?with?the?value?of?ARCHS?build?setting;?the?resulting?list?specifies?the?architectures?the?binary?can?run?on.?If?the?resulting?architecture?list?is?empty,?the?target?generates?no?binary.

該編譯項(xiàng)指定可能支持的指令集,該列表和Architectures列表的交集,將是Xcode最終生成二進(jìn)制包所支持的指令集。

比如,你的Valid Architectures設(shè)置的支持arm指令集版本有:armv7/armv7s/arm64,對應(yīng)的Architectures設(shè)置的支持arm指令集版本有:armv7s,這時(shí)Xcode只會生成一個(gè)armv7s指令集的二進(jìn)制包。

Build Active Architecture Only

官方文檔說明:

Boolean?value.?Specifies?whether?the?product?includes?only?object?code?for?the?native?architecture.

該編譯項(xiàng)用于設(shè)置是否只編譯當(dāng)前使用的設(shè)備對應(yīng)的arm指令集。

當(dāng)該選項(xiàng)設(shè)置成YES時(shí),你連上一個(gè)armv7指令集的設(shè)備,就算你的Valid Architectures和Architectures都設(shè)置成armv7/armv7s/arm64,還是依然只會生成一個(gè)armv7指令集的二進(jìn)制包。

當(dāng)然該選項(xiàng)起作用的前提是你的Xcode必須成功連接了調(diào)試設(shè)備。如果你沒有任何活躍設(shè)備,即Xcode沒有成功連接調(diào)試設(shè)備,就算該設(shè)置項(xiàng)設(shè)置成YES依然還會編譯Valid Architectures和Architectures指定的二進(jìn)制包。

通常情況下,開發(fā)測試都是在 Debug模式下,所以該編譯選項(xiàng)在Debug模式都設(shè)成YES,這樣在測試時(shí)只編譯一份指令集,有效提高開發(fā)效率。

Release模式為發(fā)布模式,需要支持各種設(shè)備指令集,所以設(shè)置為NO。

說明:

指令集都是可以向下兼容的

比如,你的設(shè)備是ARMv8指令集,那么它也可以兼容運(yùn)行比armv7s版本低的指令集:armv7、armv6


關(guān)于指令集的常見問題:

1.導(dǎo)入靜態(tài)庫后編譯報(bào)錯(cuò),Undefined symbols for architecture x86_64:

原因:

1:可能是靜態(tài)庫中不包含這個(gè)類。

2:靜態(tài)庫工程可能沒有鏈接到應(yīng)用。

3: ? 靜態(tài)庫不支持模擬器運(yùn)行;

解決辦法:

1:查看靜態(tài)庫里面是否存在這個(gè)類。

2:Build Phases中沒有添加Link Binary With Libraries 中添加此靜態(tài)庫。

3: ?在真機(jī)上運(yùn)行進(jìn)行測試(??);或者對靜態(tài)庫進(jìn)行修改,使其支持模擬器的運(yùn)行,在靜態(tài)庫target的build Settings中設(shè)置Valid Architectures為armv7 arm64 armv7s i386 x86_64

2.?使用 lipo -info 指令查看靜態(tài)庫支持的指令集

? ? ?如在命令行中輸入: lipo -info ?/test/libFireflyUI.a

3.使用lipo -create指令來合并支持真機(jī)和模擬器的靜態(tài)庫

如在命令行中輸入:lipo -create?

/Users/jinyy/Downloads/Release/iPhone_Device//libs/libFireflyUI.a

/Users/jinyy/Downloads/Release/iPhone_Simulator//libs/libFireflyUI.a

-output? /Users/jinyy/Downloads/Release/uinion/libFireflyUI.a












最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容