指令集
通常會把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