【问题标题】:Xcode 12 build target in wrong order for simulator?模拟器的Xcode 12构建目标顺序错误?
【发布时间】:2020-12-03 02:29:12
【问题描述】:

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

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

如何固定构建目标的顺序?

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

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

【问题讨论】:

标签: xcode cocoapods ios14 xcode12


【解决方案1】:

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

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

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

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

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

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

我发现,有了这个宏,在构建的链接过程中,链接目标类型将是未知类型 'arm64-apple-ios11.0-simulator' 这导致构建失败并且所有目标构建顺序错误的问题似乎只会在添加此宏时发生

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 add 添加苹果对这个宏的反馈####

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

  • Xcode 不会将 VALID_ARCHS 添加到您的项目中。确实,我们推荐 反对使用 VALID_ARCHS。也许一些 CocoaPod 将它设置在你的 出于某种原因项目? CocoaPods 不是 Xcode 的一部分,所以我们不 可以控制他们的行为。

    需要注意的一点是,在 Xcode 11 中,VALID_ARCHS 出现在 架构部分。因为我们强烈反对 使用它,它不再出现在那里,现在出现在用户 定义的部分,如果它被定义的话。

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

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

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

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

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

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

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

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

【讨论】:

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

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

详情:

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

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

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

遇到此类问题的人请多多指教。使用 Xcode 永远不会感到无聊......

【讨论】:

  • 这应该是公认的答案。至少,如果您使用的是 CocoaPods!
  • 感谢@Andrei Herford,正如苹果所说,也许我们应该在删除 VALID_ARCHS 之前确保架构(ARCHS)设置为标准架构(ARCHS_STANDARD)
  • @ximmyxiao 在我的例子中,ARCHS 已经设置为 ARCHS_STANDARD 但这并没有解决问题。无论我为 VALID_ARCHS 设置什么值。使用标准 ARCHS 删除(= 空)空 VALID_ARCHS 导致 ARCHS[@]: unbound variable 错误。只有在 ARCHS 和 VALID_ARCHS 中使用 ARCHS_STANDARD 才能解决问题。
  • @JeroenJK 你看到我几天前添加的编辑了吗?将arm64 更改为x86_64 仅在模拟器中解决了该问题。为了让项目在设备上运行,我必须将 VALID_ARCHS 更改为 $(ARCHS_STANDARD)
  • 我无法在 Xcode 12.1 中找到 VALID_ARCHS ??请推荐
【解决方案3】:

** 对于 XCode 12.4 **

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

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

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

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

在应用程序的项目中:

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

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

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

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

【讨论】:

  • 谢谢,在尝试了很多选项后,这终于对我有用了?
  • 天哪,在项目架构中添加“x86_64”。终于!
  • 另外,我注意到以下模式:例如在第一次构建到“成功的 sim”之后就可以了,随后构建到另一个 sim 也很完美。但是如果你从“不成功的模拟”开始,你就无法构建。就我而言,“成功的 sim”是 ios 13 的 sim,“不成功的”是 ios 14.2 的。
【解决方案4】:

对于 Xcode 版本 12.1 如果找不到 VALID_ARCHS 在 Architectures 中添加 **$(ARCHS_STANDARD) x86_64 i386 所有三个将解决在模拟器和设备上运行、归档的问题。还建议将 Build Active Architecture Only 添加到“Yes”。

【讨论】:

    【解决方案5】:

    这对我有用。

    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。

    【讨论】:

      猜你喜欢
      • 2021-03-29
      • 2021-05-03
      • 1970-01-01
      • 2021-05-27
      • 1970-01-01
      • 2020-12-08
      • 2021-01-08
      • 2022-11-24
      • 2012-04-24
      相关资源
      最近更新 更多