蘋果m1編譯x86
⑴ 蘋果推出首款自研晶元M1,都應用在了哪些設備上其銷量如何
蘋果推出首款自研晶元M1,應用在處理器 、英特爾平台, 圖像處理等設備上,因為還沒有正式開售,所以目前沒有銷量。
一、蘋果CEO庫克就帶來了萬眾期待的“One More Thing”——自研的電腦處理器 M1。據悉這顆晶元採用5納米製程,封裝了160億個晶體管,其數量為蘋果所有晶元之最,還擁有8核心CPU(4大核+4小核),8核心GPU,16核的神經網路引擎,最高達16GB統一內存。蘋果表示,M1的CPU性能和GPU性能比之前的筆記本晶元都要快,MacBook Air搭載M1晶元後,中央處理器速度將最高提升至3.5 倍,圖形處理器速度可最高提升至5倍,電池續航最長達18小時,比之前多出6小時。 可見在全新晶元的支撐下,Mac系列電腦將會大幅度地提升性能,突破當前算力的瓶頸,帶來更強大的能效。同時,蘋果發布了三款搭載M1晶元的新品,分別是輕型筆記本MacBook Air(7999元起)、專業版本的13寸MacBook Pro(9999元起)以及Mac mini(5299元起),將於下周正式開售。
二、處理器。作為自研的最強晶元,M1晶元自然集結了目前蘋果最強的技術,採用5nm製程工藝,高達160億個晶體管數量,從CPU、GPU、Nerual Engine到Apple T2晶元,一個由蘋果設計的全新SoC呈現在我們眼前。CPU部分採用了4+4大小核設計,蘋果對比了最新的PC處理器,在10W功耗下性能達到了“友商”的兩倍,在同性能下功耗僅有英特爾晶元的四分之一。GPU方面同樣也是8核設計,功耗在10W水平線時同樣具備“友商”兩倍的性能,同性能時功耗為三分之一。另外M1還具備16核Neural Engine,每秒可進行11萬次運算,機器學習能力也有了大幅度提高。
另外SSD性能方面也提升到了原先的兩倍,相比在大型應用的啟動速度上會有比較明顯的提升,這半年來吐槽MacBook Air SSD性能不夠的人你們贏了。不過最令人興奮的可能還是在續航方面的提升,搭載M1晶元的MacBook Air在網頁瀏覽方面可以達到15小時續航,播放視頻可以達到18小時,整體續航最多提升6小時以上,是有史以來續航最好的MacBook Air。
⑵ 解決M1 Mac 編譯失敗
M1 Mac pro Xcode編譯工程報錯 libPods-ProjectName.a' is missing one or more architectures required by this target: x86_64
For me opening Xcode in Rosetta mode was what solved the problem. You may have to remove DerivedData also at: /Users/<username>/Library/Developer/Xcode/DerivedData
You can install Rosetta by running: softwareupdate --install-rosetta
Also it seems OS prompts you to install if trying to open an app that requires Rosetta: https://support.apple.com/en-us/HT211861
https://stackoverflow.com/a/69294780
M1 Mac pro Xcode改為 Rosetta,編譯Playground報錯
Failed to launch process. Failed to attach to stub for playground execution: error: debugserver is x86_64 binary running in translation, attached failed..
It seems that you should turn off running with Rosetta for Xcode.
https://stackoverflow.com/questions/69829731/xcode-playground-failed-to-launch
⑶ M1 設備的 Xcode 編譯問題深究
在Apple發布M1晶元之前,一直使用Intel的晶元,沒有出現什麼問題。發布M1晶元後,由於兩者架構的不同(M1是arm64架構,Intel是x86_64的架構),導致很多軟體運行出現了問題。我們在M1機型中使用Xcode編譯模擬器時,可能會碰到如下報錯:
或
這些報錯,都是是由於項目中存在.a或.framework靜態庫導致的。以前,我們創建靜態庫時,會分別打包出一份針對真機(arm64)和模擬器的(x86_64),然後將這兩份合並成一個包後引入項目中進行使用。在Intel機型上,真機上使用arm64指令,模擬器(x86_64)中使用x86_64指令,所以不存在問題。但是在M1機型上,模擬器是以arm64運行的,顯然再以x86_64運行就會出現問題。
對於這類架構報錯問題,網上的資料一般會告訴你兩個解決方案:
以Rosetta模式運行Xcode。
修改Build Settings -> Excluded Architectures選項,添加Any iOS Simulator SDK選項,並設置值為arm64。圖示如下:
這兩種方案都能解決編譯問題,但是也都存在問題。
以Rosetta模式運行是M1機器上x86軟體無法運行的解決方案,它會將x86指令轉譯成ARM指令運行,這種轉譯顯然是存在性能損耗的,損耗大概在20%~30%,不到萬不得已,不推薦使用這種方案。
Excluded Architectures方案說明
修改Excluded Architectures選項也有它的問題。字面意思是排除架構的意思,我們設置在模擬器中排除arm64就能解決模擬器無法編譯arm64的問題。
這樣的設置能生效會讓人有點費解,我們知道,在intel機型上,模擬器本來就是以x86方式運行的,排除arm64毫無影響。但是在M1機型上,模擬器是以arm64方式運行的,排除了arm64反而能跑,這不是把我的智商摁在地上摩擦么?,但是蘋果就是這樣乾的,當在M1機型上,排除了模擬器的arm64架構後,模擬器還是會以arm64的方式運行,但是模擬器中的app是以x86的方式運行的,對蘋果的這個騷操作我們不得不服。圖示如下:
有時候在Excluded Architectures選項中排除了模擬器的arm64指令,依然無法編譯通過,那麼一般是項目設置和cocoapods的設置不一致導致,設置為一致後一般可以解決問題。可以通過在Podfile中添加如下內容來解決:
通過上述內容,我們知道了問題的由來,它是由於項目中存在.a或.framework,它們提供的指令集不完整導致的。Apple對於這類問題,也提供了解決方案,請由我細細道來。
以Xcode13為例,在我們創建靜態庫時,選擇真機編譯出來的包只包含arm64指令,選擇模擬器編譯出來的會同時包含arm64和x86_64指令。我看一些網上的教程,教別人將模擬器部分的arm64移除,其實大可不必。因為要支持M1機器正常跑模擬器,模擬器必須同時包含arm64和x86_64指令。
2019年的WWDC,apple提供了一種新的框架封裝格式XCFramework。簡單理解就是以前使用lipo合並不同指令集的包,現在則使用新的指令合並成XCFramework格式
打包成framework,格式如下:
打包成XCFramework後,格式如下:
從上述可以看出,XCFramework就是把兩個不同指令集的framework放入了同一個文件夾(.xcframework),並生成了一個配置文件Info.plist。這樣生成的XCFramework就可以完美的解決M1機器無法編譯模擬器的問題。
XCFramework的創建指令也很簡單:
以現在的情況,很多第三方框架,並沒有使用XCFramework,而項目中只要有一個框架沒有支持模擬器的arm64指令,那麼在M1機器上,模擬器只能以Rosetta模式運行應用,對這一塊的普遍支持估計要等M1普及以後了。
蘋果換芯,成了開發者們的噩夢?
armv6、armv7、armv7s、armv8、armv64及其i386、x86_64區別
細說iOS靜態庫和動態庫
關於Xcode11的XCFrameworks框架