前言
將一個老項(xiàng)目由Xcode11升級到Xcode12的時候灶平,在用模擬器編譯的時候惕蹄,報(bào)了一個錯誤绎狭,具體如下:
“l(fā)d: 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和百度就上了,經(jīng)過一番查找芜飘,基本定位到問題了务豺。
原因
下面翻譯一位外國同仁的解釋:
Xcode 12實(shí)際上是Apple Silicon的墊腳石,但有了這個平臺嗦明,我們將得到基于arm64的macOS笼沥,模擬器也將運(yùn)行在arm64架構(gòu)上,而不是目前基于Intel的x86_64架構(gòu)娶牌。
Xcode通常依賴于“Run Destination”來構(gòu)建它的庫/應(yīng)用程序奔浅,所以當(dāng)一個模擬器被選擇為“Run Destination”時,它將為可用的模擬器架構(gòu)構(gòu)建應(yīng)用程序裙戏,當(dāng)一個設(shè)備被選擇為“Run Destination”時乘凸,它將為設(shè)備支持的架構(gòu)構(gòu)建(arm*)厕诡。
xcodebuild累榜,在Xcode 12+ build系統(tǒng)中,arm64是支持Apple Silicon的有效架構(gòu)。因此壹罚,當(dāng)一個模擬器被選擇為運(yùn)行目標(biāo)時葛作,它可能會嘗試針對基于arm64的模擬器編譯/鏈接你的庫/應(yīng)用程序。所以它在<architecture>-<os>-<sdk>-<destination>格式中給clang(++)發(fā)送了一些-target標(biāo)志猖凛,如arm64-apple-ios13.0-simulator赂蠢,clang試圖構(gòu)建/鏈接基于arm64的模擬器,但最終在基于Intel的mac上失敗辨泳。
但xcodebuild只在發(fā)布版本中嘗試這個虱岂。因?yàn)椤癇uild Active Architecture Only (ONLY_ACTIVE_ARCH)”構(gòu)建設(shè)置通常被設(shè)置為“No”,僅用于“發(fā)布”配置菠红。這意味著xcodebuild將嘗試為選定的運(yùn)行目標(biāo)構(gòu)建所有庫/應(yīng)用的架構(gòu)變體第岖。對于模擬器運(yùn)行目標(biāo),它現(xiàn)在將包括x86_64和arm64试溯,因?yàn)閍rm64在Xcode 12+中也是一個支持Apple Silicon的模擬器架構(gòu)蔑滓。
了解原因后,剩下來就是如何解決了遇绞。
解決方法
首先看一下Xcode11和Xcode12在Architecture配置這一塊的區(qū)別:
Xcode11:
Xcode11中有Valid Architectures的配置項(xiàng)键袱。
Xcode12:
在Xcode12中,在Architecture配置組中摹闽,用Excluded Architectures代替了Valid Architectures蹄咖,那么Valid Architectures跑到哪里去了,在User-Defined配置組里面钩骇。
我們的目的是能在Xcode12的模擬器上順利編譯比藻,那么可按照下面的步驟修改:
1. 將Build Active Architecture Only配置的debug值改為Yes。如下圖倘屹。
2. 如果在Xcode11中有Valid Architectures的配置項(xiàng)银亲,那么請?jiān)赬code12的User-Defined配置組里面刪除Valid Architectures的配置項(xiàng),同時在Target上面的Project里面的User-Defined配置組里面同樣刪除Valid Architectures的配置項(xiàng)纽匙,如何刪除务蝠,選中,敲擊鍵盤的delete就可以了烛缔。
3. 將Validate Workspace配置項(xiàng)修改一次馏段,一定要變成黑粗體,默認(rèn)值是NO践瓷,改成Yes就可以院喜,或者再改回NO,反正得折騰一次晕翠。見下圖喷舀。(之前有一篇文章升級Xcode12.3報(bào)錯提到過這個配置砍濒,可參考一下。)
4. 配置完前三步基本就能編譯通過了硫麻,如果還是報(bào)錯爸邢,請嘗試在Excluded Architectures的debug模式下添加arm64,如下圖:
經(jīng)過這幾步拿愧,基本就能順利編譯通過了杠河,不過別忘了再用真機(jī)編譯試試哦,別再影響了真機(jī)測試浇辜。
結(jié)束語
個人感覺這個是Xcode12的一個坑了券敌,不過如果所有的項(xiàng)目里面都采用XCFramework,估計(jì)這個問題就能屏蔽掉了柳洋。
原文鏈接:https://blog.csdn.net/guoyongming925/article/details/114628455