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

xim*_*iao 31 xcode cocoapods ios14 xcode12

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

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

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

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

在此处输入图片说明

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

在此处输入图片说明

xim*_*iao 55

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

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

2 在主项目的构建阶段显式添加所有 cocodpods 目标作为依赖项

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

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

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

在此处输入图片说明

我发现,使用这个宏,在构建的 LINK 期间,链接目标类型将是未知类型' arm64-apple-ios11.0-simulator ',这导致构建失败以及所有目标构建的问题错误的顺序似乎只会在添加此宏时发生

XcodeDefault.xctoolchain/usr/bin/clang -target arm64-apple-ios11.0-simulator 
Run Code Online (Sandbox Code Playgroud)

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

XcodeDefault.xctoolchain/usr/bin/clang -target x86_64-apple-ios11.0-simulator 
Run Code Online (Sandbox Code Playgroud)

####2020-09-11 add 添加苹果关于这个宏的反馈####

更新 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,并确保架构 (ARCHS) 设置为标准架构 (ARCHS_STANDARD) 而不是特定的内容(除非您真的确切地知道为什么不使用 ARCHS_STANDARD) .

####反馈结束####

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

删除某些人的 VALID_ARCHS 宏后,构建可能仍然无法正常工作,您可以查看添加的 Apple 反馈的答案和@Andrei Herford 的答案:

确保架构 (ARCHS) 设置为标准架构 (ARCHS_STANDARD)

然后删除宏,希望这两个步骤适用于所有人:)

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


And*_*ord 44

我不仅可以在架构设置中使用for ,而且还可以在模拟器和设备上解决此问题。我不确定以这种方式改变拱门可能会产生什么副作用,但到目前为止我还没有遇到任何新问题。$(ARCHS_STANDARD)ARCHSVALID_ARCHS

在此处输入图片说明

细节:

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

在为模拟器构建时,替换arm64x86_64VALID_ARCHS 解决了问题。这似乎arm64从来都不是一个正确的平台,而是被 Xcode 转换为 x86。随着 Apple 宣布转向 ARM 处理器,这种翻译不再正确,因此必须使用正确的平台x86_64

关于 Apple VALID_ARCHS 不应再使用。但是,此修复在为设备构建时不起作用。最终使用$(ARCHS_STANDARD)代替(用于模拟器和设备)在两种情况下都可以解决问题。

遇到这种问题的其他人,请多多包涵。使用 Xcode 永远不会无聊....