c语言 - 预定义的宏,用于确定是否在覆盆子上运行?



我正在维护一个在GNU/Linux(x86,x86_64),Windows(x86,x86_64),Bionic/Android(armeabi-v7a,arm64-v8a,x86,x86_64)和Raspberry Pi(armhf)上运行的应用程序。由于Raspberry OS实际上是GNU/Linux Debian的修改版本,我可以确定我是否在ARM(__arm__)上运行linux(__linux__),但我无法辨别它是否是硬浮动的。 (是的,这可能是一个XY问题。

我需要一种方法来确定树莓,因为代码的某些部分无法在Android上实现。是的,我可以在编译时使用-DRASPBERRY,但想知道编译器是否已经为我这样做了。最好是标准宏而不是特定于编译器的宏,但我正在使用 gcc 在 Linux 上进行交叉编译。

我正在考虑__ARM_FP,但不确定。

该软件可在型号 2 及更高版本上运行,任何提示都值得赞赏。

编辑 1

为了确定这一点,我一直在 Linux x86_64 上使用原生 gcc 的输出、4 个 NDK 变体和一个用于 x86 的 mingw crross 编译器。这些引起了我的注意:

__ARM_ARCH在 all
__ARM_32BIT_STATE上,__ARM_64BIT_STATE可能很有用
__ARM_EABI____ARMEL__似乎只出现在 Android 的armeabi-v7a和 Raspbian 的 gcc 中,所以可能是很好的候选者
__ARM_FP对它们都有不同的值,一旦我弄清楚它的含义,这也可能是有用的

一般处理问题。如何确定哪些标志可用?使用 GCC 转储预处理器定义 。

我无法辨别它是否是硬浮动的。

这是微不足道的:

  • 列出所有具有硬浮点的编译器宏
  • 列出所有不带硬浮点的编译器宏
  • 显示差异

例如:我拿arm-none-eabi-gcccortex-m7有硬件浮点支持。我愿意:

$ get() { arm-none-eabi-gcc -mcpu=cortex-m7 -dM -E - < /dev/null "$@" | sort; }
$ diff <(get -mfloat-abi=soft) <(get -mfloat-abi=hard)
26c26,27
< #define __ARM_PCS 1
---
> #define __ARM_FP 14
> #define __ARM_PCS_VFP 1
132a134,139
> #define __FP_FAST_FMA 1
> #define __FP_FAST_FMAF 1
> #define __FP_FAST_FMAF32 1
> #define __FP_FAST_FMAF32x 1
> #define __FP_FAST_FMAF64 1
> #define __FP_FAST_FMAL 1
153,154c160,161
< #define __GCC_IEC_559 0
< #define __GCC_IEC_559_COMPLEX 0
---
> #define __GCC_IEC_559 2
> #define __GCC_IEC_559_COMPLEX 2
299d305
< #define __SOFTFP__ 1

__SOFTFP__可能对您来说非常有趣(使用该特定编译器时)。

预定义的宏来确定是否在覆盆子上运行?

好吧,你无法知道你的代码将在什么上运行,只能知道它被编译的架构。查看以下各项的输出:

diff <(ssh myraspberry gcc -dM -E - < /dev/null | sort) <(gcc -dM -E - </dev/null | sort)

这些宏可能听起来很有趣:

< #define __ARM_32BIT_STATE 1
< #define __ARM_ARCH 6
< #define __ARM_ARCH_6__ 1
< #define __ARM_ARCH_ISA_ARM 1
< #define __ARM_ARCH_ISA_THUMB 1
< #define __ARM_EABI__ 1
< #define __ARM_FEATURE_CLZ 1
< #define __ARM_FEATURE_COPROC 15
< #define __ARM_FEATURE_DSP 1
< #define __ARM_FEATURE_LDREX 4
< #define __ARM_FEATURE_QBIT 1
< #define __ARM_FEATURE_SAT 1
< #define __ARM_FEATURE_SIMD32 1
< #define __ARM_FEATURE_UNALIGNED 1
< #define __ARM_FP 12
< #define __ARM_PCS_VFP 1

好吧,根据 Arm C 语言扩展

5.5.1 如果硬件浮点可用,则设置硬件浮点
__ARM_FP。

。并继续枚举可能的有效值为0x040x60xC0xE

NDK 为armeabi-v7a设置了0xC,为arm64-v8a设置了0xE,我有点困惑,因为 Raspberry OS 中的 gcc 编译器将其设置为12...这是0x0C.

相关内容

  • 没有找到相关文章

最新更新