我试图在我的Xcode框架中使用特定于架构的构建设置,这样我就可以分别处理Apple和Intel的情况。我需要使用此构建设置作为金属中的宏来检查half数据类型是否在CPU上被支持(苹果硅支持它,但英特尔不支持它)。
我的当前实现使用了一个xcconfig文件,其行如下:
IS_X86_64[arch=x86_64] = 1
然后,在我的构建设置中,我有以下用户定义的条件(来自xcconfig):

然后,我创建了宏IS_INTEL,以便它可以用于金属:

问题是
从理论上讲,我觉得这应该是可行的。然而,在我的英特尔mac上运行我的金属应用程序,就能为IS_X86_64提供0。我做的第一件事是检查是否正确设置了构建设置并替换了
IS_X86_64[arch=x86_64] = 1与IS_X86_64[arch=*] = 1
这起作用了,所以我知道问题必须是我当前的体系结构没有被正确地表示出来。深入探究为什么会发生这种情况,结果发现CURRENT_ARCH的值(它应该保存项目正在运行的当前设备体系结构的值)是undefined_arch。
在他们的Xcode 10发行说明中,苹果提到了undefined_arch的一些说法:
在运行shell脚本构建阶段时,新的构建系统传递undefined_arch作为ARCH环境变量的值。该值以前没有很好地定义。依赖于此值的任何shell脚本都必须针对正在构建的所有已定义的体系结构(通过ARCHS环境变量提供)进行正确的行为。
但是,我没有在shell上构建我的项目,也没有任何shell脚本。有谁知道我怎样才能解决这个问题,这样特定于架构的构建设置就会像他们应该的那样运行吗?
发布于 2022-02-05 23:55:33
您可以通过内置宏检查体系结构。您可以看到它们如何在usr/include/TargetConditionals.h中使用。
#if __is_target_arch(x86_64)
...
#endif更多宏:
__is_target_arch(arm64)
__is_target_arch(arm64e)
__is_target_os(ios)
__is_target_environment(macabi)
__is_target_environment(simulator)https://stackoverflow.com/questions/70999932
复制相似问题