xcode64位編譯
⑴ Xcode Build For ios Simulator arm64
前言
將一個老項目由Xcode11升級到Xcode12的時候,在用模擬器編譯的時候,報了一個錯誤,具體如下:
「ld: building for iOS Simulator, but linking in dylib built for iOS, file '/Users/xxxx/Work/Git/xxx/Framework/GoogleCast/GoogleCast.framework/GoogleCast' for architecture arm64」
我使用模擬器編譯的,遇到arm64的錯誤,一開始還是一頭霧水啊。於是Google和網路就上了,經過一番查找,基本定位到問題了。
原因
下面翻譯一位外國同仁的解釋:
Xcode 12實際上是Apple Silicon的墊腳石,但有了這個平台,我們將得到基於arm64的macOS,模擬器也將運行在arm64架構上,而不是目前基於Intel的x86_64架構。
Xcode通常依賴於「Run Destination」來構建它的庫/應用程序,所以當一個模擬器被選擇為「Run Destination」時,它將為可用的模擬器架構構建應用程序,當一個設備被選擇為「Run Destination」時,它將為設備支持的架構構建(arm*)。
xcodebuild,在Xcode 12+ build系統中,arm64是支持Apple Silicon的有效架構。因此,當一個模擬器被選擇為運行目標時,它可能會嘗試針對基於arm64的模擬器編譯/鏈接你的庫/應用程序。所以它在<architecture>-<os>-<sdk>-<destination>格式中給clang(++)發送了一些-target標志,如arm64-apple-ios13.0-simulator,clang試圖構建/鏈接基於arm64的模賣世擬器,但最終在基於Intel的mac上失敗。
但xcodebuild只在發布版本中嘗試這個。因為「Build Active Architecture Only (ONLY_ACTIVE_ARCH)」構建設置通常被設置為「No」,僅用於「發布」配置。這意味著xcodebuild將嘗試為選定的運行目標構建所有庫/應用的架構變體。對於模擬器運行目標,它現在將包括x86_64和arm64,因為arm64在Xcode 12+中也是一個支持Apple Silicon的模擬器架構。
了解原因後,剩下來就是如何解決了。
解決方法
首先看一下Xcode11和Xcode12在Architecture配置這一塊的區別:
Xcode11:中宴肢
Xcode11中有Valid Architectures的配置項。
Xcode12:
在Xcode12中,在Architecture配置組中,用Excluded Architectures代替了Valid Architectures,那麼Valid Architectures跑到哪裡去了,在User-Defined配置組裡面。
我們的目的是能在Xcode12的模擬器上順利編譯,那麼可按照下面的步驟修改:
1. 將Build Active Architecture Only配置的debug值改為Yes。如下圖。
2. 如果在Xcode11中有Valid Architectures的配置項,那麼請在Xcode12的User-Defined配置組裡面刪除Valid Architectures的配置項,同時在Target上面的Project裡面的User-Defined配置組裡面同樣刪除Valid Architectures的配置項,如何刪除,選中,敲擊鍵盤的delete就可以了。
3. 將Validate Workspace配置項修改一次,一定要變成黑粗體,默認值是NO,改成Yes就可以,或者再改回NO,反正得折騰一次。見下圖。(之前有一篇文章升級Xcode12.3報錯提到過這個配置,可參考一下。)
4. 配置完前三步基本就能編譯通過了,如果還是報錯,請嘗試在Excluded Architectures的debug模式下添加arm64,如下圖:
經過這幾步,基本就能順利編譯通過了,不過別忘了再用真機編譯試試哦,別再影響了真機祥禪測試。
結束語
個人感覺這個是Xcode12的一個坑了,不過如果所有的項目裡面都採用XCFramework,估計這個問題就能屏蔽掉了。
原文鏈接:https://blog.csdn.net/guoyongming925/article/details/114628455