指令集
通常會把CPU的擴展指令集稱為”CPU的指令集”(因為基本的次慢,類似加減的指令似乎是必須被CPU所支持的指令)。每款CPU在設(shè)計時就規(guī)定了一系列與其硬件電路相配合的指令集致盟。
Arm處理器
Arm處理器,因為其低功耗和小尺寸而聞名,幾乎所有的手機處理器都基于arm情连,其在嵌入式系統(tǒng)中的應用非常廣泛,它的性能在同等功耗產(chǎn)品中也很出色览效。想了解ARM指令集的請點擊這里却舀。
iPhone指令集
蘋果A7處理器支持兩個不同的指令集:32位ARM指令集(armv6|armv7|armv7s)和64位ARM指令集(arm64),i386|x86_64 是Mac處理器的指令集锤灿,i386是針對intel通用微處理器32架構(gòu)的挽拔。x86_64是針對x86架構(gòu)的64位處理器。當使用iOS模擬器的時候會遇到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)于生成二進制包指令集相關(guān)的設(shè)置
主要有以下三個:
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.
該編譯選項指定了工程將被編譯成支持哪些指令集,支持指令集是通過編譯生成對應的二進制數(shù)據(jù)包實現(xiàn)的,如果支持的指令集數(shù)目有多個术裸,就會編譯出包含多個指令集代碼的數(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.
該編譯項指定可能支持的指令集袭艺,該列表和Architectures列表的交集搀崭,將是Xcode最終生成二進制包所支持的指令集。
比如猾编,你的Valid Architectures設(shè)置的支持arm指令集版本有:armv7/armv7s/arm64瘤睹,對應的Architectures設(shè)置的支持arm指令集版本有:armv7s,這時Xcode只會生成一個armv7s指令集的二進制包。
Build Active Architecture Only
官方文檔說明:
Boolean?value.?Specifies?whether?the?product?includes?only?object?code?for?the?native?architecture.
該編譯項用于設(shè)置是否只編譯當前使用的設(shè)備對應的arm指令集。
當該選項設(shè)置成YES時,你連上一個armv7指令集的設(shè)備,就算你的Valid Architectures和Architectures都設(shè)置成armv7/armv7s/arm64执虹,還是依然只會生成一個armv7指令集的二進制包。
當然該選項起作用的前提是你的Xcode必須成功連接了調(diào)試設(shè)備习霹。如果你沒有任何活躍設(shè)備暇屋,即Xcode沒有成功連接調(diào)試設(shè)備,就算該設(shè)置項設(shè)置成YES依然還會編譯Valid Architectures和Architectures指定的二進制包攘轩。
通常情況下叉存,開發(fā)測試都是在 Debug模式下,所以該編譯選項在Debug模式都設(shè)成YES度帮,這樣在測試時只編譯一份指令集歼捏,有效提高開發(fā)效率。
Release模式為發(fā)布模式笨篷,需要支持各種設(shè)備指令集瞳秽,所以設(shè)置為NO。
說明:
指令集都是可以向下兼容的
比如率翅,你的設(shè)備是ARMv8指令集练俐,那么它也可以兼容運行比armv7s版本低的指令集:armv7、armv6
關(guān)于指令集的常見問題:
1.導入靜態(tài)庫后編譯報錯,Undefined symbols for architecture x86_64:
原因:
1:可能是靜態(tài)庫中不包含這個類冕臭。
2:靜態(tài)庫工程可能沒有鏈接到應用腺晾。
3: ? 靜態(tài)庫不支持模擬器運行;
解決辦法:
1:查看靜態(tài)庫里面是否存在這個類辜贵。
2:Build Phases中沒有添加Link Binary With Libraries 中添加此靜態(tài)庫悯蝉。
3: ?在真機上運行進行測試(??);或者對靜態(tài)庫進行修改托慨,使其支持模擬器的運行鼻由,在靜態(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指令來合并支持真機和模擬器的靜態(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