我正在维护一个在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-gcc
,cortex-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。
。并继续枚举可能的有效值为0x04
、0x6
、0xC
和0xE
。
NDK 为armeabi-v7a
设置了0xC
,为arm64-v8a
设置了0xE
,我有点困惑,因为 Raspberry OS 中的 gcc 编译器将其设置为12
...这是0x0C
.