參考文章
ARM
ARM架構,是一種低成本、高性能、低耗電處理器架構,目前廣泛的在移動通信領域中使用。
ARM處理器指令集
32位ARM指令集(armv6|armv7|armv7s)和64位ARM指令集(arm64)。
i386|x86_64 是Mac處理器的指令集,i386是針對intel通用微處理器32架構的。x86_64是針對x86架構的64位處理器。
當使用iOS模擬器的時候會遇到i386|x86_64,iOS模擬器沒有arm指令集。
iOS移動設備指令集
從這個表來說,指令集是向下兼容的,如果只添加了armv7,那么在armv7s 和arm64的機器上也是可以運行的;如果只添加armv7s,在arm64的機器上也能運行;只是不能發揮該機器的所有性能。
指令集 | 對應機型 |
---|---|
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
指定工程支持的指令集的集合,如果設置多個architecture,則生成的二進制數據包會包含多個指令集代碼,體積會變大。
-
Valid Architectures
有效的指令集集合,Architectures與Valid Architectures 的交集來確定最終的數據包包含的指令集代碼。
Xcode9.1創建的工程,Valid Architectures默認有這幾個:armv7 armv7s arm64
-
Build Active Architecture Only
指定是否只對當前連接設備所支持的指令集編譯,默認Debug的時候設置為YES,Release的時候設置為NO。設置為YES是只編譯當前的architecture版本,生成的包只包含當前連接設備的指令集代碼。設置為NO,則生成的包包含所有的指令集代碼(上面的Valid Architectures跟Architectures的交集)。因此為了調試速度更快,則Debug應該設置為YES。
特殊:設置此值為YES,如果連接的設備是arm64的( iPhone 5s,iPhone6(plus)等),則Valid Architecture 中必須包含arm64, 否則編譯會報錯(報錯內容如下圖)。
當前連接設備為6s,而Valid Architectures只添加了armv7和armv7s.png
工程中Architectures默認是這樣子的,那這個表示包含那幾個指令集呢:
具體步驟如下:
-
步驟一:
步驟一.png -
步驟二:
步驟二.png
步驟二(1).png
因此可以得出結論,Architectures(工程支持的指令集合)默認的為armv7和arm64。對比上面指令集的表格,Architectures 和Valid Architectures這兩個該如何設置,相信已經很簡單了吧!如果Valid Architectures添加:armv7 armv7s arm64 , Architectures中保持默認,那最終編譯得到的framework是支持armv7和arm64(交集)
App適配64位
導入靜態庫,報錯:ld: symbol(s) not found for architecture arm64
例如這樣:
可能原因:
1、靜態庫不包含該報錯的類。
2、靜態庫沒有鏈接到應用
3、靜態庫不支持64位。
對應解決辦法:
1、如果是自己打包的靜態庫,可以查看靜態庫是否包含這個文件,具體方法是打開靜態庫源代碼,查看Bulid Phases -> Compile Sources ->是否包含該文件。如果是別人的靜態庫,就得找那個人了。(做項目的時候,發現Xcode9.0是有bug的,直接拖入工程的文件,不會自動添加到Compile Sources中,內部創建的文件,有時候也不能自動添加,這時候就需要手動添加了。)
靜態庫源代碼中,文件是否存在和導入.png
2、打開自己的引用到該靜態庫的工程,查看Bulid Phases ->Link Binary With Libraries ->查看該靜態庫是否已經導入
查看是否導入靜態庫.png
3、查看靜態庫是否支持64位,如果是自己的靜態庫,可以查看是否添加arm64,如果是別人的,找那個人就是了,打他。