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

Xcode 12以错误的顺序为模拟器构建目标?,xcode,cocoapods,ios14,xcode12,Xcode,Cocoapods,Ios14,Xcode12,我的项目总是在所有使用Xcode 11的设备上正确运行,但是在我安装了Xcode 12 beta 4之后,它无法在模拟器上构建 我比较了Xcode 11和Xcode 12的构建日志,在Xcode 12中,我的主要目标似乎是在cocoapods目标之前构建的,因此链接将失败,因为找不到cocoapods库 如何确定构建目标的顺序 在Xcode 11中,一切正常我自己的目标是在cocoapods目标之后建立的。 在Xcode 12中,构建是无序的我自己的目标是在cocoapods目标之前构建的。

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

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

如何确定构建目标的顺序

在Xcode 11中,一切正常我自己的目标是在cocoapods目标之后建立的。

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


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

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

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

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

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

我找到了重现此问题的更确切原因,似乎我在xcode 12中打开的项目文件将在用户定义中自动生成一个有效的\u ARCHS宏,而此宏将使生成失败

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

XcodeDefault.xctoolchain/usr/bin/clang -target arm64-apple-ios11.0-simulator 
删除此有效的_ARCHS宏后,链接目标类型将为“x86_64-apple-ios11.0-simulator”,一切正常

XcodeDefault.xctoolchain/usr/bin/clang -target x86_64-apple-ios11.0-simulator 
####2020-09-11添加苹果对该宏的反馈####

更新苹果对有效ARCH的反馈
  • 在查看您的反馈后,我们有一些附加信息 给你:

  • Xcode不会将有效的\u arch添加到项目中。事实上,我们建议 反对使用有效的拱门。也许是某个椰子荚把它放在你的 出于某种原因的项目?Cocoapod不是Xcode的一部分,所以我们不 对他们的行为有任何控制权

    需要注意的一点是,在Xcode 11中,有效的_arch出现在 架构科。因为我们强烈建议不要这样做 使用它,它不再显示在那里,现在显示在用户界面中 定义的节(如果它已定义)

  • Xcode 11用于自动转换arm64的建筑,用于 针对x86_64构建的模拟器,但现在arm64是一个有效的 模拟器架构(苹果硅架构),即 翻译不再发生

  • 因此,我们怀疑您应该做的是从您的 项目,并确保将架构(ARCHS)设置为 标准体系结构(ARCHS_标准),而不是特定的 (除非您确实知道为什么不使用ARCHS_标准)

####反馈端####

####2020-10-10新增####

在删除某些人的有效_ARCHS宏后,构建可能仍然无法工作,您可以查看以下添加的苹果反馈和@Andrei Herford的答案:

确保将架构(ARCH)设置为标准架构 (ARCHS_标准)

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


####2020年10月10日添加了end#####

通过使用
$(ARCHS_标准)
不仅在架构设置中为
ARCHS
而且在
有效ARCHS
中,我能够在模拟器和设备上解决这个问题。我不确定以这种方式改变拱门可能有什么副作用,但到目前为止,我还没有遇到任何新的问题

详细信息:

@ximmyxiao的出色回答让我走上了正确的道路。然而,他提出的解决方案(移除有效的拱门)对我不起作用。这导致编译Pod目标时出现新问题(Pods脚本中的
命令PhaseScriptExecution失败,退出代码为非零和
ARCHS[@]:未绑定变量)

在有效的ARCH中将
arm64
替换为
x86\u 64
,解决了构建模拟器时的问题。似乎
arm64
从来都不是一个正确的平台,而是由Xcode翻译成x86的。随着苹果宣布转向ARM处理器,这种翻译不再正确,因此必须使用正确的平台
x86_64

关于苹果,不应再使用有效的拱门。但是,在构建设备时,此修复程序不起作用最终使用
$(ARCHS_标准)
(模拟器和设备)在这两种情况下都成功了。

对遇到此类问题的其他人要有良好的评价。在Xcode 12.1版中,使用Xcode永远不会让人感到无聊。…

如果找不到有效的\u arch
体系结构中添加**$(ARCHS_标准)x86_64 i386这三种体系结构将解决在模拟器和设备上运行、存档的问题。还建议将构建活动体系结构仅添加到“”中

以下是对我有用的东西

  • 从用户定义的设置中删除了
    有效的\u ARCHS
  • ARCHS
    设置为
    $(ARCHS\u标准)
  • 为我的项目创建了一个新的
    .xcconfig
    文件。(如果您已有一个,则可以跳过此选项)
  • 将这些添加到我的
    .xcconfig
    文件中
  • 在那之后,我能够为模拟器和设备构建这两者。这里的想法是
    EXCLUDED_ARCHS[sdk=iphoneos*] = x86_64
    EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64