【问题标题】:Architecture-Specific Build Settings in Xcode 13Xcode 13 中特定于架构的构建设置
【发布时间】:2022-06-20 08:13:06
【问题描述】:

我正在尝试在我的 Xcode 框架中使用特定于体系结构的构建设置,以便我可以分别处理 Apple Silicon Mac 和 Intel Mac 的情况。我需要将此构建设置用作 Metal 中的宏来检查 CPU 是否支持 half 数据类型(Apple Silicon 支持但 Intel 不支持)。

我当前的实现使用带有以下行的 xcconfig 文件:

IS_X86_64[arch=x86_64] = 1

然后,在我的构建设置中,我有以下用户定义的条件(来自 xcconfig):

然后我创建了宏 IS_INTEL,以便它可以在 Metal 中使用:

问题来了

理论上我觉得这应该可行。但是,在我的 Intel mac 上运行我的 Metal 应用程序会为 IS_X86_64 生成 0。我做的第一件事是检查我的构建设置是否正确并被替换

IS_X86_64[arch=x86_64] = 1IS_X86_64[arch=*] = 1

这行得通,所以我知道问题一定是我当前的架构没有被正确表示。进一步探究为什么会发生这种情况,事实证明CURRENT_ARCH 的值(应该保存项目正在运行的当前设备架构的值)是undefined_arch

在他们的Xcode 10 release notes 中,苹果提到了一些关于undefined_arch 的内容:

新的构建系统在运行 shell 脚本构建阶段时传递 undefined_arch 作为 ARCH 环境变量的值。该值以前没有很好地定义。任何依赖于该值的 shell 脚本必须对所有正在构建的已定义架构正确运行,可通过 ARCHS 环境变量获得。

但是,我没有在 shell 上构建我的项目,也没有任何 shell 脚本。 有谁知道我该如何解决这个问题,以便特定于架构的构建设置能够正常运行?

【问题讨论】:

    标签: ios xcode macos x86-64


    【解决方案1】:

    您可以通过内置宏检查架构。你可以在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)
    

    【讨论】:

    • usr/include/TargetConditionals.h 中的宏与 TargetConditionals.h 中定义的宏不同,可以在 Metal 中使用。我尝试使用__is_target_arch(x86_64),但没有成功:(
    • 说“in Metal”是指在着色器中检查架构的必要性吗?
    • 是的,但我需要它是一个宏,因为我想为不同的架构使用不同的 typedef(对于 Arm CPU 使用 half,对于 Intel CPU 使用 float
    【解决方案2】:

    你能解决这个问题吗?我遇到了同样的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-22
      • 2012-04-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多