【问题标题】:What predefined macro can I use to detect the target architecture in Clang?我可以使用什么预定义的宏来检测 Clang 中的目标架构?
【发布时间】:2014-07-19 01:10:04
【问题描述】:

我想根据目标架构是否编写代码,例如armv7、armv7s 或 arm64。

我不能使用sysctlbyname 的原因是这会给我运行时的底层架构,但是当 arm64 例如模拟 armv7,sysctl(貌似)仍然报告 arm64。

【问题讨论】:

  • 为什么会有问题?根据定义,64 位代码知道它在 AArch64 状态的 v8 上运行。如果 32 位代码看到“arm64”或任何其他(不准确的)v8 同义词,那么它可以推断它在 AArch32 状态的 v8 上运行。如果您没有在运行时进行动态调度,那么您的目标架构就是您选择编译的任何目标。
  • 我要报告目标架构。

标签: macros arm clang


【解决方案1】:

clang --target=... -mcpu=... -E - -dM </dev/null 将输出所有预定义的预处理器宏(gcc 也类似)

我没有看到提供答案的单个宏,但您可能可以使用 __ARM_ARCHdefined(__ARM_ARCH_*) 的某种组合。

【讨论】:

  • __ARM_ARCH 支持 32 位和 64 位 ARM 机器。我相信 Bram 的答案更接近正确答案。
【解决方案2】:

__ARM_ARCH_ISA_A64 是预定义的,如果它的目标是 arm64,

__ARM_ARCH_7S__ 用于 armv7s,

__ARM_ARCH_7A__ 用于 armv7。

使用:clang -arch arm64 -E -dM - < /dev/null,可以输出预处理宏。

【讨论】:

  • 这是问题还是答案?请详细说明。
  • 这并没有提供问题的答案。要批评或要求作者澄清,请在其帖子下方发表评论。
  • __ARM_ARCH_ISA_A64 是预定义的,如果它的目标是 arm64。 __ARM_ARCH_7S__ 用于 armv7s,__ARM_ARCH_7A__ 用于 armv7。使用clang -arch arm64 -E -dM - < /dev/null可以输出Preprocess marco,我在这个里面找到的。
  • @fengxing 你在“this”找到了。源头在哪里?
【解决方案3】:

虽然这不是问题的 100% 答案,但可能有用:

使用 clang 时,您可以使用以下方法区分 32 位臂和 64 位臂:

__arm__ 是为 32 位 arm 定义的,仅限 32 位 arm。

__aarch64__ 是为 64bit arm 定义的,仅限 64bit arm。

【讨论】:

    猜你喜欢
    • 2011-02-09
    • 2013-11-07
    • 1970-01-01
    • 2015-12-23
    • 2015-08-30
    • 2017-11-07
    • 1970-01-01
    • 2018-09-17
    相关资源
    最近更新 更多