M1電腦xcode14模擬器使用Rosetta運(yùn)行解決方案

問題描述:

蘋果M1系列芯片電腦運(yùn)行模擬器時(shí),報(bào)錯(cuò):
...building for iOS Simulator, but linking in object file built for iOS...

解決方案:

xcode14之前:
我們可以右鍵xcode->顯示簡(jiǎn)介->勾選使用Rosetta打開,這樣就是在模擬器上跑了。


image.png

xcode14后:
蘋果在xcode的簡(jiǎn)介里沒有了這個(gè)選項(xiàng),導(dǎo)致使用模擬器項(xiàng)目跑不起來,經(jīng)過一番摸索:

xcode打開項(xiàng)目->Product-> Destination-> Destination Architecturesk 可以選擇用哪種模式的模擬器打開。
我們選擇 (Rosetta)結(jié)尾的模擬器即可。


WX20230414-105221@2x.png
WX20230414-105308@2x.png

踩坑記錄:

為什么推薦使用Rosseta模式?

網(wǎng)上介紹的使用配置xcode 模擬器執(zhí)行架構(gòu)模式改為arm64的方案,并不能完全解決所有問題,比如項(xiàng)目中如果使用了某個(gè)靜態(tài)庫(kù),而該靜態(tài)庫(kù)打包模擬器的時(shí)候并沒有支持arm64j架構(gòu),那你還是會(huì)編譯不過。雖說使用arm64運(yùn)行模擬器會(huì)充分發(fā)揮M1芯片的優(yōu)化,性能更高點(diǎn),但一些老的三方庫(kù)(比如Cordova)不支持也會(huì)導(dǎo)致整個(gè)項(xiàng)目跑不起來。
另一個(gè)缺點(diǎn)就是你修改之后提交代碼之后,其他同時(shí)使用intel芯片的又無法使用arm64架構(gòu)的模擬器了,所以這塊代碼還不能提交以免影響其他同事。

所以終極解決方案還是使用Rosetta運(yùn)行,這種模式是將arm64指令轉(zhuǎn)成intel芯片的x86_64指令集,性能上會(huì)差一點(diǎn),但對(duì)于M1芯片的電腦來說也感受不出來,這種方案是通用方案。

附上修改編譯模擬架構(gòu)方案:
修改Build Settings -> Excluded Architectures選項(xiàng),添加Any iOS Simulator SDK選項(xiàng),并設(shè)置為arm64
同時(shí)podfile 文件也需要修改,改完之后執(zhí)行一次 pod install

post_install do |installer|
  installer.pods_project.build_configurations.each do |config|
    config.build_settings["EXCLUDED_ARCHS[sdk=iphonesimulator*]"] = "arm64"
  end
end
為什么模擬器會(huì)報(bào)錯(cuò)找不到第三方庫(kù)?

在M1芯片之前,模擬器是x86_64架構(gòu)(更早的是i386),真機(jī)是arm系列,armv7,armv7s,arm64,arm64e這些.
制作靜態(tài)庫(kù)的時(shí)候,分別制作了模擬器和真機(jī),Intel芯片制作的模擬器版本靜態(tài)庫(kù)是x86_64,而M1是arm64,
通常會(huì)把模擬器和真機(jī)的用lipo命令合在一起,并且合并的時(shí)候相同的架構(gòu)是需要去掉一個(gè)的,通常我們?nèi)サ裟M器的arm64,因?yàn)槿サ粽鏅C(jī)的,手機(jī)就不能編譯了.
現(xiàn)在M1的mac制作的模擬器版本是arm64,真機(jī)也有arm64,就無法合并了,本來m1的模擬器就需要arm64的架構(gòu),現(xiàn)在刪掉模擬器的arm64導(dǎo)致m1上的模擬器無法使用這個(gè)合并后的靜態(tài)庫(kù).
那為什么真機(jī)的arm64模擬器不能用呢,因?yàn)閷?shí)際上這倆還是不一樣的.

現(xiàn)在有兩種解決方案,一是把模擬器和Xcode設(shè)置為Rosetta模式(只是運(yùn)行app project的話,只設(shè)置模擬器也行),這樣的話模擬器就使用x86_64的架構(gòu).
第二種方案就是wwdc19新增的XCFramework.
還是合并,只不過使用新的指令,這樣的話就不用刪除模擬器的arm64了.

1.合并.a
xcodebuild -create-xcframework -library <path> [-headers <path>] [-library <path> [-headers <path>]...] -output <path>

xcodebuild -create-xcframework -library youpath/TestFramework.a -headers youpath/TestFramework -library youpath/TestFramework.a -headers youpath/TestFramework -output youpath/TestFramework.xcframework

2.合并.framework
xcodebuild -create-xcframework -framework <path> [-framework <path>...] -output <path>

xcodebuild -create-xcframework -framework Release-iphoneos/TestFramework.framework -framework Release-iphonesimulator/TestFramework.framework -output TestFramework.xcframework

參考文章:
http://m.itdecent.cn/p/9df49126ec27

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

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

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