“Architectures”和“Valid Architectures”在Xcode构建设置中有什么区别?
在Xcode的构建设置中,“Architectures”和“Valid Architectures”之间有什么区别?
在Xcode 12之前的版本中,“VALID_ARCHS”可以支持以下工作流程:
- 您在一个目标上设置“VALID_ARCHS”。
- 调用xcodebuild时,您使用“xcodebuild ARCHS=…”来指定要构建的架构,以确定要在您的二进制文件中包含的架构(它们可以是通用的)。
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及以后的版本中,“VALID_ARCHS”被弃用。相反,应该在目标上使用“EXCLUDED_ARCHS”来排除一些架构。现在,要完成相同的工作流程,您在上述目标上设置“DISABLED_ARCHS=x86_64”。
在Xcode Build Settings中,“Architectures”和“Valid Architectures”之间有什么区别?
根据苹果文档,我们知道Xcode将构建的二进制文件是由“Valid Architectures”和“Architectures”两者的交集决定的。
所以,我不认为Jeremy的回答是正确的,他说:
“也许你只想为armv7s构建二进制文件,但是相同的源代码在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/armv7/armv7s上正常运行,因为ARM处理器是向后兼容的。
他是对的:“因为这是你实际上想要使用你的代码构建的。”
在Xcode Build Settings中,"Architectures"和"Valid Architectures"之间的区别是,"Architectures"表示你想要构建的架构,而"Valid Architectures"表示你可以使用你的代码库构建的架构。
解决方法是,通常情况下,你可以不用担心改变"Valid Architectures",只需要调整"Architectures"来设置你想要构建的架构。通常,你可以将Debug版本设置为只针对
大多数情况下,你不需要关注"Valid Architectures"。如果你正在为特定的架构编写内联汇编代码,你可能会更改"Valid Architectures"以反映你的代码不再适用于除了这些架构之外的任何架构。然而,它主要只是Xcode给你的提示,表示它可以构建的架构,并且你可以从中选择适合你的"Architectures"。
"resulting architecture list"是在构建时在内存中完成的。
总结起来,你只需要关注调整"Architectures"来设置你想要构建的架构,而不用担心"Valid Architectures"。