提问人:ximmyxiao 提问时间:8/13/2020 最后编辑:ximmyxiao 更新时间:3/19/2021 访问量:37636
模拟器的 Xcode 12 构建目标顺序错误?
Xcode 12 build target in wrong order for simulator?
问:
我的项目始终在使用 Xcode 11 的所有设备上正常运行,但在我安装 Xcode 12 beta 4 后,它无法在模拟器上构建。
我比较了 Xcode 11 和 Xcode 12 的构建日志,似乎在 Xcode 12 中,我的主要目标是在 cocoa pods 目标之前构建的,因此链接将失败,因为找不到 cocoapods 库。
如何修复构建目标的顺序?
在 Xcode 11 中,一切都很好。我自己的目标是在 cocoapods 目标之后构建的。
在 Xcode 12 中,构建是乱序的 我自己的目标在 cocoapods 目标之前构建的。
答:
好的,我得到了一个解决方案来使构建工作(这种解决问题的方式不正确,正确的修复方法在我的更新中添加):
1 你需要将 Pods 项目作为外部项目添加到你的主项目中
2 在主项目的构建阶段将所有 cocodpods 目标明确添加为依赖项
但我仍然认为 xcode 12 的新测试版可能会解决这个问题。因为它似乎是 Xcode 12 的一个错误(我的项目在 Xcode 11 和 Xcode 12 + iOS 设备中工作完美,仅在 Xcode 12 + 模拟器中失败)
###2020-08-17更新###
我找到了一个更确切的原因来重现这个问题,似乎我在 Xcode 12 中打开的项目文件会在 User-Defines 中自动生成一个VALID_ARCHS宏,并且这个宏会使构建失败
而且我发现,有了这个宏,在构建LINK的时候,链接目标类型会是一个未知的类型 “arm64-apple-ios11.0-模拟器” 导致构建失败,并且所有目标以错误顺序构建的问题似乎只会在添加此宏时发生
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 对 VALID_ARCHS 的反馈在查看您的反馈后,我们有一些其他信息 给你的:
Xcode 不会将VALID_ARCHS添加到您的项目中。事实上,我们建议 反对使用VALID_ARCHS。也许一些 CocoaPod 正在将它设置在您的 出于某种原因的项目?CocoaPods 不是 Xcode 的一部分,因此我们不是 对他们的所作所为有任何控制权。
需要注意的一点是,在 Xcode 11 中,VALID_ARCHS出现在 架构部分。由于我们强烈建议不要 使用它,它不再显示在那里,现在出现在用户中 定义的部分(如果已定义)。
Xcode 11 用于自动翻译 arm64 的构建 模拟器进入构建x86_64,但现在 arm64 是有效的 模拟器架构(它是 Apple Silicon 架构),即 不再进行翻译。
因此,我们怀疑您应该做的VALID_ARCHS是从您的 项目,并确保 Architectures (ARCHS) 设置为 标准架构 (ARCHS_STANDARD) 而不是特定的东西 (除非你真的确切地知道为什么不使用ARCHS_STANDARD)。
####Feedback 完####
####2020-10-10 添加####
对于某些人来说,删除 VALID_ARCHS 宏后,构建可能仍然不起作用,您可以查看添加的 Apple 反馈的答案,并在下面@Andrei Herford 的答案:
确保“体系结构 (ARCHS)”设置为“标准体系结构” (ARCHS_STANDARD)
然后删除宏,希望这两个步骤对所有人都有效:)
####2020-10-10 添加结束####
评论
我不仅在架构设置中使用了 for,而且还在我不确定以这种方式改变足弓可能有什么副作用,但到目前为止,我还没有遇到任何新问题。$(ARCHS_STANDARD)
ARCHS
VALID_ARCHS
详:
@ximmyxiao的出色回答让我走上了正确的轨道。但是,他提出的解决方案(删除VALID_ARCHS)对我不起作用。这导致了编译 Pod 目标(和 Pod 脚本)时的新问题。Command PhaseScriptExecution failed with a nonzero exit code
ARCHS[@]: unbound variable
相反,替换为 in VALID_ARCHS 解决了为模拟器构建时的问题。这似乎从来都不是一个正确的平台,并被 Xcode 翻译成 x86。由于苹果公司已经宣布转向ARM处理器,这种转换不再正确,因此必须使用正确的平台。arm64
x86_64
arm64
x86_64
关于苹果VALID_ARCHS不应再使用。但是,在为设备生成时,此修复不起作用。最终,在这两种情况下都使用 $(ARCHS_STANDARD
) 代替(用于模拟器和设备)都成功了。
给遇到这种问题的人好看。使用 Xcode 永远不会感到无聊......
评论
ARCHS[@]: unbound variable
arm64
x86_64
VALID_ARCHS
$(ARCHS_STANDARD)
对于 Xcode 版本 12.1 如果找不到VALID_ARCHS 在架构中将 **$(ARCHS_STANDARD) 添加到 i386 x86_64这三个将解决在模拟器和设备上运行的问题,存档。还建议将“仅构建活动架构”添加到“是”。
这是对我有用的东西。
- 从用户定义的设置中删除
VALID_ARCHS
- 将
ARCHS
$(ARCHS_STANDARD)
- 为我的项目创建了一个新文件。(如果您已经有一个,那么您可以跳过此内容)
.xcconfig
- 将这些添加到我的文件中
.xcconfig
EXCLUDED_ARCHS[sdk=iphoneos*] = x86_64 EXCLUDED_ARCHS[sdk=iphonesimulator*] = arm64
在那之后,我能够为模拟器和设备构建。这里的想法是在模拟器上构建时排除 arm64,并在设备上x86_64。
** 对于 XCode 12.4 **
我有带有 M1 的 Apple MB Pro 和带有 Moya POD 的项目以及许多其他项目。 应用程序在具有相同版本的 XCode (12.4) 的旧英特尔 macbook 中完美构建。 但是对于 M1,它不会编译说:“找不到 Moya”。什么??
它说:“找不到目标'x86_64-apple-ios-simulator'的模块'Moya';找到:arm64、arm64-apple-ios-simulator”。
没有任何建议对我有用。所以帮助我的是:
- (不确定这是否必要):通过 pod install 重新安装所有 pod
- 清除生成数据
- 通过 Rosette 启动(在 XCode 应用程序属性 cmd+i 中检查)
在 App 的项目中:
- “Architectures”:添加x86_64
- “仅构建活动架构”:是
在“Pods”项目中,冲突的 pod 部分(在我的情况下是 Moya):
- “仅构建活动架构”:是
然后重建。可能还需要下一次重建。
评论