Xcode 构建设置中的"Architectures"和"Valid Architectures"有什么区别?



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

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

因此,也许您只想为armv7构建二进制文件,但对于armv7和armv6来说,相同的源代码可以编译得很好。所以VALID_ARCHS = armv6 armv7 armv7s,但您设置了ARCHS = armv7s,因为这就是实际希望使用代码构建的全部内容。

或者,用苹果的话说:

ARCHS(体系结构)

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

和:

VALID_ARCHS(有效体系结构)

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

来源:Xcode构建设置参考

在实践中,您不必担心更改VALID_ARCHS,只需摆弄ARCHS即可设置要构建的体系结构。通常,您只需将Debug构建设置为NATIVE_ARCH,因为您只想为将要测试/运行它的机器构建调试版本,并为您计划支持的所有体系结构构建Release构建。

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

所以,我不认为Jeremy的答案是正确的,正如他所说:

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

当您设置VALID_ARCHS = armv6 armv7 armv7sARCHS = armv7s时,二进制Xcode将生成armv7s,它不能与armv6/armv7兼容。

如果你想与armv6/armv7/armv7s兼容,你必须设置VALID_ARCHS = armv6 armv7 armv7sARCHS = armv6。这样,二进制Xcode将生成armv6,并且它可以在两个armv6/arm v7/arm v7s上运行良好,因为arm处理器是向后兼容的。

xcode 12时代之前

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

  • 您在目标上设置了VALID_ARCHS
  • 当调用xcodebuild时,您传递要使用xcodebuild ARCHS=...为其构建的arch,以说明您希望在二进制文件中包含哪些体系结构(它们可能是通用的)

Xcode将取两者的交集,并为它们构建目标。假设一个目标只支持arm64,而您的大多数目标都支持x86_64arm64。您拨打xcodebuild ARCHS="x86_64 arm64"。这就是发生的事情:

  • 您设定的目标:VALID_ARCHS=arm64
  • xcodebuild将ARCHS设置为:arm64x86_64
  • 将为交叉口arm64建造目标

但是,如果使用ARCHS,就是这样

  • 您设定的目标:ARCHS=arm64
  • xcodebuild覆盖ARCHSarm64 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

最新更新