模拟器的 Xcode 12 构建目标顺序错误?

Xcode 12 build target in wrong order for simulator?

提问人:ximmyxiao 提问时间:8/13/2020 最后编辑:ximmyxiao 更新时间:3/19/2021 访问量:37636

问:

我的项目始终在使用 Xcode 11 的所有设备上正常运行,但在我安装 Xcode 12 beta 4 后,它无法在模拟器上构建。

我比较了 Xcode 11 和 Xcode 12 的构建日志,似乎在 Xcode 12 中,我的主要目标是在 cocoa pods 目标之前构建的,因此链接将失败,因为找不到 cocoapods 库。

如何修复构建目标的顺序?

在 Xcode 11 中,一切都很好。我自己的目标是在 cocoapods 目标之后构建的。

enter image description here

在 Xcode 12 中,构建是乱序的 我自己的目标在 cocoapods 目标之前构建的。

enter image description here

Xcode Cocoapods iOS14 XCode12

评论

0赞 Larme 8/13/2020
也许 stackoverflow.com/questions/10285964/......
0赞 ximmyxiao 8/13/2020
@Larme,不是同一个问题,你发布的链接在同一个项目中,但是我的项目在使用工作区时,我无法在不同的项目中显式设置目标依赖
0赞 ximmyxiao 8/13/2020
@Larme事实上,我的项目在 Xcode 11 中仍然构建正常,它只会在 Xcode 12 中构建失败,所以我认为可能是 Xcode 中的某种机制导致了这个问题
0赞 8/13/2020
stackoverflow.com/questions/5752660/what-is-a-target-dependency stackoverflow.com/questions/4219054/......
1赞 user427969 10/13/2020
提供的 2 个答案让我朝着正确的方向前进,但没有解决问题。这对我有用:stackoverflow.com/a/63955114/427969

答:

57赞 ximmyxiao 8/14/2020 #1

好的,我得到了一个解决方案来使构建工作(这种解决问题的方式不正确,正确的修复方法在我的更新中添加)

1 你需要将 Pods 项目作为外部项目添加到你的主项目中

2 在主项目的构建阶段将所有 cocodpods 目标明确添加为依赖项

但我仍然认为 xcode 12 的新测试版可能会解决这个问题。因为它似乎是 Xcode 12 的一个错误(我的项目在 Xcode 11 和 Xcode 12 + iOS 设备中工作完美,仅在 Xcode 12 + 模拟器中失败)

###2020-08-17更新###

我找到了一个更确切的原因来重现这个问题,似乎我在 Xcode 12 中打开的项目文件会在 User-Defines 中自动生成一个VALID_ARCHS宏,并且这个宏会使构建失败

enter image description here

而且我发现,有了这个宏,在构建LINK的时候,链接目标类型会是一个未知的类型 “arm64-apple-ios11.0-模拟器” 导致构建失败,并且所有目标以错误顺序构建的问题似乎只会在添加此宏时发生

XcodeDefault.xctoolchain/usr/bin/clang -target arm64-apple-ios11.0-simulator 

删除此VALID_ARCHS宏后,链接目标类型将为“x86_64-apple-ios11.0-simulator”,一切顺利

XcodeDefault.xctoolchain/usr/bin/clang -target x86_64-apple-ios11.0-simulator 

####2020-09-11 添加 添加苹果对此宏的反馈####

更新 Apple 对 VALID_ARCHS 的反馈
  • 在查看您的反馈后,我们有一些其他信息 给你的:

  • Xcode 不会将VALID_ARCHS添加到您的项目中。事实上,我们建议 反对使用VALID_ARCHS。也许一些 CocoaPod 正在将它设置在您的 出于某种原因的项目?CocoaPods 不是 Xcode 的一部分,因此我们不是 对他们的所作所为有任何控制权。

    需要注意的一点是,在 Xcode 11 中,VALID_ARCHS出现在 架构部分。由于我们强烈建议不要 使用它,它不再显示在那里,现在出现在用户中 定义的部分(如果已定义)。

  • Xcode 11 用于自动翻译 arm64 的构建 模拟器进入构建x86_64,但现在 arm64 是有效的 模拟器架构(它是 Apple Silicon 架构),即 不再进行翻译。

  • 因此,我们怀疑您应该做的VALID_ARCHS是从您的 项目,并确保 Architectures (ARCHS) 设置为 标准架构 (ARCHS_STANDARD) 而不是特定的东西 (除非你真的确切地知道为什么不使用ARCHS_STANDARD)。

####Feedback 完####

####2020-10-10 添加####

对于某些人来说,删除 VALID_ARCHS 宏后,构建可能仍然不起作用,您可以查看添加的 Apple 反馈的答案,并在下面@Andrei Herford 的答案:

确保“体系结构 (ARCHS)”设置为“标准体系结构” (ARCHS_STANDARD)

然后删除宏,希望这两个步骤对所有人都有效:)

####2020-10-10 添加结束####

评论

0赞 matt 8/14/2020
如果它只是模拟器中的错误,您应该向 Apple 报告此问题。
0赞 ximmyxiao 8/14/2020
@matt,其实不知道怎么反馈给苹果-_-
1赞 ximmyxiao 9/22/2020
@AndrewSas很高兴帮助您解决这个问题,兄弟:)
1赞 RemembranceNN 9/25/2020
感谢您的修复,但在 xCode 11 中VALID_ARCH设置位于另一部分 - “架构”中,因此它也存在于 xCode 11 中。但 xCode 12 不会使用该设置在模拟器上构建
1赞 ximmyxiao 9/25/2020
@RemembranceNN,是的,苹果说XCode12将这个宏移动到用户定义(因为他们不推荐这个宏),似乎这个移动导致了问题
48赞 Andrei Herford 10/1/2020 #2

我不仅在架构设置中使用了 for,而且还在我不确定以这种方式改变足弓可能有什么副作用,但到目前为止,我还没有遇到任何新问题。$(ARCHS_STANDARD)ARCHSVALID_ARCHS

enter image description here

详:

@ximmyxiao的出色回答让我走上了正确的轨道。但是,他提出的解决方案(删除VALID_ARCHS)对我不起作用。这导致了编译 Pod 目标(和 Pod 脚本)时的新问题。Command PhaseScriptExecution failed with a nonzero exit codeARCHS[@]: unbound variable

相反,替换为 in VALID_ARCHS 解决了为模拟器构建时的问题。这似乎从来都不是一个正确的平台,并被 Xcode 翻译成 x86。由于苹果公司已经宣布转向ARM处理器,这种转换不再正确,因此必须使用正确的平台。arm64x86_64arm64x86_64

关于苹果VALID_ARCHS不应再使用。但是,在为设备生成时,此修复不起作用。最终,在这两种情况下都使用 $(ARCHS_STANDARD) 代替(用于模拟器和设备)都成功了。

给遇到这种问题的人好看。使用 Xcode 永远不会感到无聊......

评论

1赞 Jeroen 10/8/2020
这应该是公认的答案。至少,如果您使用的是 CocoaPods!
0赞 ximmyxiao 10/10/2020
感谢 @Andrei Herford,就像苹果所说,也许我们应该确保架构 (ARCHS) 设置为标准架构 (ARCHS_STANDARD) 在删除VALID_ARCHS
1赞 Andrei Herford 10/12/2020
@ximmyxiao 就我而言,ARCHS 已经设置为 ARCHS_STANDARD,但这并没有解决问题。无论我为VALID_ARCHS设置了什么值。删除 (= empty) 空VALID_ARCHS与标准 ARCHS let 导致错误。只有在 ARCHS 和 VALID_ARCHS 中使用 ARCHS_STANDARD才能解决问题。ARCHS[@]: unbound variable
1赞 Andrei Herford 10/13/2020
@JeroenJK 你看过我几天前添加的编辑吗?更改为仅在模拟器中解决问题。为了让项目在设备上运行,我必须更改为arm64x86_64VALID_ARCHS$(ARCHS_STANDARD)
1赞 iMinion 10/21/2020
我无法在 Xcode 12.1 中找到VALID_ARCHS?请建议
2赞 iMinion 10/22/2020 #3

对于 Xcode 版本 12.1 如果找不到VALID_ARCHS 在架构中将 **$(ARCHS_STANDARD) 添加到 i386 x86_64这三个将解决在模拟器和设备上运行的问题,存档。还建议将“仅构建活动架构”添加到“”。enter image description here

2赞 cessmestreet 1/22/2021 #4

这是对我有用的东西。

  1. 从用户定义的设置中删除VALID_ARCHS
  2. ARCHS$(ARCHS_STANDARD)
  3. 为我的项目创建了一个新文件。(如果您已经有一个,那么您可以跳过此内容).xcconfig
  4. 将这些添加到我的文件中.xcconfig
EXCLUDED_ARCHS[sdk=iphoneos*] = x86_64
EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64

在那之后,我能够为模拟器和设备构建。这里的想法是在模拟器上构建时排除 arm64,并在设备上x86_64。

3赞 Sergey 3/19/2021 #5

** 对于 XCode 12.4 **

我有带有 M1 的 Apple MB Pro 和带有 Moya POD 的项目以及许多其他项目。 应用程序在具有相同版本的 XCode (12.4) 的旧英特尔 macbook 中完美构建。 但是对于 M1,它不会编译说:“找不到 Moya”。什么??

它说:“找不到目标'x86_64-apple-ios-simulator'的模块'Moya';找到:arm64、arm64-apple-ios-simulator”。

没有任何建议对我有用。所以帮助我的是:

  • (不确定这是否必要):通过 pod install 重新安装所有 pod
  • 清除生成数据
  • 通过 Rosette 启动(在 XCode 应用程序属性 cmd+i 中检查)

在 App 的项目中:

  • “Architectures”:添加x86_64
  • “仅构建活动架构”:是

在“Pods”项目中,冲突的 pod 部分(在我的情况下是 Moya):

  • “仅构建活动架构”:是

然后重建。可能还需要下一次重建。

评论

0赞 Nicolas Sturm 4/4/2021
谢谢,在尝试了很多选择🎉后,这终于对我有用了
0赞 Iskeraet 4/12/2021
Holy Balls,为项目架构工作添加“x86_64”。最后!
0赞 Sergey 4/13/2021
此外,我还注意到以下模式:例如,在第一次构建到“成功的模拟”之后,后续构建到另一个模拟也可以。但是,如果你从“不成功的模拟”开始,你就无法构建。就我而言,“成功的 sim”是 ios 13 的 sim,而“不成功的 sim”是 ios 14.2 的 sim。