繁体   English   中英

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

[英]Xcode 12 build target in wrong order for simulator?

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

I compared the build logs of Xcode 11 and Xcode 12 and it seems in Xcode 12 that my main target is being built before the cocoa pods target, and so the link will fail because the cocoapods library will not be found.

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

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

在此处输入图像描述

在 Xcode 12 中,构建出现故障我自己的目标是在 cocoapods 目标之前构建的。

在此处输入图像描述

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

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

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

但我仍然认为 xcode 12 的新测试版可能会解决这个问题。 because it seem a bug of xcode 12 ( my project work perfect in xcode 11 and xcode 12 + ios device, failed in xcode 12 + simulator only)

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

我找到了重现此问题的更确切原因,似乎我在 xcode 12 中打开的项目文件将在用户定义中自动生成 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 添加结束####

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

在此处输入图像描述

细节:

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

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

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

遇到此类问题的其他人很好看。 与 Xcode 一起工作永远不会感到无聊......

** 对于 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):

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

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

对于 Xcode 版本 12.1 如果找不到 VALID_ARCHS 添加 **$(ARCHS_STANDARD) x86_64 i386架构中的所有三个将解决在模拟器和设备上运行、归档的问题。 还建议将“仅构建活动架构”添加到“”。 在此处输入图像描述

这对我有用。

  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。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM