它们的含义是什么?我可以将它们设置为不同的值吗?
架构是您想要构建的架构,有效的架构是您可以用代码库构建的架构。
因此,也许您只想为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 armv7s
和ARCHS = armv7s
时,二进制Xcode将生成armv7s,它不能与armv6/armv7兼容。
如果你想与armv6/armv7/armv7s兼容,你必须设置VALID_ARCHS = armv6 armv7 armv7s
和ARCHS = armv6
。这样,二进制Xcode将生成armv6,并且它可以在两个armv6/arm v7/arm v7s上运行良好,因为arm处理器是向后兼容的。
xcode 12时代之前
VALID_ARCHS
可以支持这样的工作流程:
- 您在目标上设置了VALID_ARCHS
- 当调用xcodebuild时,您传递要使用
xcodebuild ARCHS=...
为其构建的arch,以说明您希望在二进制文件中包含哪些体系结构(它们可能是通用的)
Xcode将取两者的交集,并为它们构建目标。假设一个目标只支持arm64
,而您的大多数目标都支持x86_64
和arm64
。您拨打xcodebuild ARCHS="x86_64 arm64"
。这就是发生的事情:
- 您设定的目标:
VALID_ARCHS=arm64
- xcodebuild将
ARCHS
设置为:arm64
x86_64
- 将为交叉口
arm64
建造目标
但是,如果使用ARCHS
,就是这样
- 您设定的目标:
ARCHS=arm64
- xcodebuild覆盖
ARCHS
到arm64 x64
- 将为
arm64
和x86_64
构建目标<-不是你想要的
xcode 12时代及以后
https://developer.apple.com/documentation/xcode-release-notes/xcode-12-release-notes
VALID_ARCHS
已弃用。相反,应该在目标上使用EXCLUDED_ARCHS
来排除某些体系结构。
因此,现在要执行相同的工作流,请在前面提到的目标上设置DISABLED_ARCHS=x86_64
。