在 Xcode 构建设置中,“架构”和“有效的架构”有什么区别?

它们的含义是什么? 我可以将它们设置为不同的值吗?

45781 次浏览

架构是您想要构建的,有效的架构是您可以设想用代码库构建的架构。

因此,也许您只想为 armv7构建二进制文件,但是相同的源代码可以很好地为 armv7和 armv6编译。所以 VALID_ARCHS = armv6 armv7 armv7s,但是您设置了 ARCHS = armv7s,因为实际上 want只需要用代码构建 ARCHS = armv7s

或者,用苹果的话说:

ARCHS (Architectures)

以空格分隔的标识符列表。指定二进制文件所针对的体系结构(ABI、处理器模型)。当此生成设置指定多个体系结构时,生成的二进制文件可能包含每个指定体系结构的目标代码。

以及:

VALID _ ARCHS (有效体系结构)

以空格分隔的标识符列表。指定可为其生成二进制文件的体系结构。在生成期间,此列表与 ARCHS 生成设置的值相交; 生成的列表指定二进制文件可以在其上运行的体系结构。如果结果体系结构列表为空,则目标不生成二进制文件。

资料来源: Xcode 构建设置参考

实际上,您不需要修改 VALID_ARCHS,只需要修改 ARCHS来设置您想要构建的体系结构。通常,您将 Debug build 设置为仅 NATIVE_ARCH,因为您只想为将要测试/运行它的计算机构建调试版本,并且针对您计划支持的所有架构构建发布版本。

从 Apple 文档中,我们知道二进制 Xcode 将构建与 Architectures相交的列表 Valid Architectures

所以,我不认为 Jeremy 的回答是正确的,就像他说的:

因此,也许您只想为 armv7构建二进制代码,但是相同的源代码也可以
为 armv7和 armv6编译。所以 VALID_ARCHS = armv6 armv7 armv7s,但是你设置 ARCHS = armv7s,因为这就是您实际想要用代码构建的全部内容。

当设置 VALID_ARCHS = armv6 armv7 armv7sARCHS = armv7s时,二进制 Xcode 的结果是 armv7,它不能与 armv6/armv7兼容。

如果你想兼容 armv6/armv7/armv7s,你必须设置 VALID_ARCHS = armv6 armv7 armv7sARCHS = armv6。这样,二进制 Xcode 的结果就是 armv6,它可以在 armv6/armv7/armv7s 上运行良好,因为 arm 处理器是向后兼容的。

Pre xcode 12 era

VALID_ARCHS可以支持这样的工作流程:

  • 在目标上设置 VALID _ ARCHS。
  • 在调用 xcodebuild 时,需要传递用 xcodebuild ARCHS=...构建的 archs,以说明要在二进制文件中包含哪些架构(它们可以是通用的)。

Xcode will take intersection of the two and build the targets for them. Imagine a target only supports arm64, while most of your targets support x86_64 and arm64. You call xcodebuild ARCHS="x86_64 arm64". This is what happens:

  • 你瞄准目标: VALID_ARCHS=arm64
  • Xcodebuild 将 ARCHS设置为: arm64 x86_64
  • Target will be built for intersection arm64

但是,如果使用 ARCHS,会发生这种情况吗

  • 你瞄准目标: ARCHS=arm64
  • Xcodebuild 将 ARCHS覆盖到 arm64 x64
  • 目标将为 arm64x86_64建立! <-不是你想要的。

Xcode 12时代及以后

Https://developer.apple.com/documentation/xcode-release-notes/xcode-12-release-notes

不推荐使用 VALID_ARCHS。相反,应该在目标上使用 EXCLUDED_ARCHS来排除某些体系结构。

因此,现在要执行相同的工作流程,需要在上述目标上设置 DISABLED_ARCHS=x86_64