32

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

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

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

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

在此处输入图像描述

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

在此处输入图像描述

4

5 回答 5

56

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

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 添加添加 Apple 对此宏的反馈####

更新 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 添加结束####

于 2020-08-14T01:14:17.390 回答
46

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

在此处输入图像描述

细节:

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

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

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

遇到此类问题的其他人很好看。使用 Xcode 永远不会感到无聊......

于 2020-10-01T06:52:55.020 回答
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):

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

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

于 2021-03-19T09:00:24.423 回答
2

For Xcode Version 12.1 If you can't find VALID_ARCHS Adding **$(ARCHS_STANDARD) x86_64 i386 all three in Architectures will solve the issue for running on simulators and Devices , archiving . also suggestedly add Build Active Architecture Only to 'Yes'. enter image description here

于 2020-10-22T07:37:03.243 回答
2

这对我有用。

  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-01-22T02:35:18.427 回答