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)庫時,會分別打包出一份針對真機(arm64)和模擬器(x86_64),然后將這兩份合并成一個包后引入項目中進行使用刻伊。在Intel機型上哪轿,真機上使用arm64指令蔚袍,模擬器(x86_64)中使用x86_64指令侧蘸,所以不存在問題。但是在M1芯片的機型上偎捎,模擬器是以arm64運行的蠢终,顯然再以x86_64運行就會出現(xiàn)問題。
解決方案:
1茴她、以Rosetta模式運行Xcode
2寻拂、修改Build Settings -> Excluded Architectures選項,添加Any iOS Simulator SDK選項丈牢,并設(shè)置為arm64
備注:以Rosetta模式運行是M1機器上x86軟件無法運行的解決方案兜喻,它會將x86指令轉(zhuǎn)譯成ARM指令運行,這種轉(zhuǎn)譯顯然是存在性能損耗的赡麦,損耗大概在20%~30%。
裝了個友盟sdk帕识,只支持真機泛粹,然后清除,好家伙既然報錯: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)庫時蒙挑,選擇真機編譯出來的包只包含arm64指令,選擇模擬器編譯出來的會同時包含arm64和x86_64指令愚臀。我看一些網(wǎng)上的教程忆蚀,教別人將模擬器部分的arm64移除,其實大可不必。因為要支持M1機器正常跑模擬器馋袜,模擬器必須同時包含arm64和x86_64指令男旗。2019年的WWDC,apple提供了一種新的框架封裝格式XCFramework欣鳖。簡單理解就是以前使用lipo合并不同指令集的包察皇,現(xiàn)在則使用新的指令合并成XCFramework格式。打包成framework泽台。XCFramework就是把兩個不同指令集的framework放入了同一個文件夾(.xcframework)什荣,并生成了一個配置文件Info.plist。這樣生成的XCFramework就可以完美的解決M1機器無法編譯模擬器的問題师痕。