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

问题描述

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

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

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

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

enter image description here

在Xcode 12中,构建不正常我自己的目标是在可可足目标之前构建的。

enter image description here

解决方法

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

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宏,并且此宏将使构建失败

enter image description here

我发现,有了这个宏,在建筑物的LINK期间,链接目标类型将是未知类型 ' 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架构), 翻译不再发生。

  • 因此,我们怀疑您应该从您的帐户中删除VALID_ARCHS 项目,并确保将架构(ARCHS)设置为 标准体系结构(ARCHS_STANDARD)而非特定内容 (除非您确切地知道为什么不使用ARCHS_STANDARD)。

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

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

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

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

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

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

,

不仅在体系结构设置中为$(ARCHS_STANDARD)使用了ARCHS,而且在VALID_ARCHS中使用了Command PhaseScriptExecution failed with a nonzero exit code,我也可以在模拟器和设备中解决问题也一样我不确定以这种方式改变牙弓会产生什么副作用,但是到目前为止,我还没有遇到任何新问题。

enter image description here

详细信息:

@ximmyxiao的出色回答使我走上了正确的轨道。但是,他的解决方案proposalnd(删除VALID_ARCHS)对我不起作用。编译 Pod目标(Pods脚本中的ARCHS[@]: unbound variablearm64)时,这导致了一个新问题。

用VALID_ARCHS中的x86_64代替arm64解决了构建模拟器时的问题。看来x86_64从来不是一个正确的平台,并且Xcode已将其翻译为x86。随着Apple宣布转向ARM处理器,这种翻译不再正确,因此必须使用正确的平台$(ARCHS_STANDARD)

关于Apple VALID_ARCHS,不再使用。但是,构建设备时,此修复程序不起作用。 最终在两种情况下都使用$response = Http::contentType('application/x-www-form-urlencoded') ->withToken($access_token) ->timeout('2000') ->get('https://example /.../...',[ ]);` (针对模拟器和设备)代替了。

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

,

** 对于 XCode 12.4 **

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

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

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

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

在应用程序的项目中:

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

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

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

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

,

这对我有用。

  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。

,

对于Xcode版本12.1 如果找不到VALID_ARCHS 将** $(ARCHS_STANDARD)x86_64 i386全部添加到 Architectures 中,将解决在模拟器和设备上进行归档的问题。还建议仅在“ ”中添加 Build Active Architecture enter image description here

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...