M1芯片Xcode運(yùn)行模擬器報錯問題以及解決方案

M1芯片的蘋果電腦使用xcode在使用cocoapods安裝第三方庫編譯模擬器的時候可能會報錯:
...building for iOS Simulator, but linking in object file built for iOS...
導(dǎo)致這樣的原因是由于M1芯片模擬器架構(gòu)是arm64架構(gòu),而Inter芯片是x86_64的架構(gòu),而我們的靜態(tài)庫時,會分別打包出一份針對真機(jī)(arm64)和模擬器(x86_64),然后將這兩份合并成一個包后引入項目中進(jìn)行使用。在Intel機(jī)型上,真機(jī)上使用arm64指令,模擬器(x86_64)中使用x86_64指令,所以不存在問題。但是在M1芯片的機(jī)型上,模擬器是以arm64運(yùn)行的,顯然再以x86_64運(yùn)行就會出現(xiàn)問題。
解決方案:
1、以Rosetta模式運(yùn)行Xcode
2、修改Build Settings -> Excluded Architectures選項,添加Any iOS Simulator SDK選項,并設(shè)置為arm64


image.png

備注:以Rosetta模式運(yùn)行是M1機(jī)器上x86軟件無法運(yùn)行的解決方案,它會將x86指令轉(zhuǎn)譯成ARM指令運(yùn)行,這種轉(zhuǎn)譯顯然是存在性能損耗的,損耗大概在20%~30%。
裝了個友盟sdk,只支持真機(jī),然后清除,好家伙既然報錯:Undefined symbols...
可以通過如下配置來解決:在 Podfile 中添加如下設(shè)置:

post_install do |installer|
    installer.pods_project.build_configurations.each do |config|
      config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
    end
end

通過上述內(nèi)容,我們知道了問題的由來,它是由于項目中存在.a或.framework,它們提供的指令集不完整導(dǎo)致的。Apple對于這類問題,也提供了解決方案,以Xcode13為例,在我們創(chuàng)建靜態(tài)庫時,選擇真機(jī)編譯出來的包只包含arm64指令,選擇模擬器編譯出來的會同時包含arm64和x86_64指令。我看一些網(wǎng)上的教程,教別人將模擬器部分的arm64移除,其實大可不必。因為要支持M1機(jī)器正常跑模擬器,模擬器必須同時包含arm64和x86_64指令。2019年的WWDC,apple提供了一種新的框架封裝格式XCFramework。簡單理解就是以前使用lipo合并不同指令集的包,現(xiàn)在則使用新的指令合并成XCFramework格式。打包成framework。XCFramework就是把兩個不同指令集的framework放入了同一個文件夾(.xcframework),并生成了一個配置文件Info.plist。這樣生成的XCFramework就可以完美的解決M1機(jī)器無法編譯模擬器的問題。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容