在 armhf 中没有实现 __fpclassify
Posted
技术标签:
【中文标题】在 armhf 中没有实现 __fpclassify【英文标题】:no implementation of __fpclassify in armhf 【发布时间】:2021-10-18 10:03:00 【问题描述】:我正在使用 ARM 的 10.3-2021.07 GCC toolchain(特别是未压缩到 ARMGCC
的 this 文件)对 Raspberry Pi 4B 进行交叉编译。我还使用最新的 Raspberry OS image 作为 sysroot(循环安装到 RPISYSROOT
)。主机是 Windows 主机上的 Ubuntu Xenial VM。
使用此编译行时(为便于阅读而编辑,CFLAGS
灵感来自 Pi 的 /proc/cpuinfo
、gentoo 和 GNU):
$ARMGCC/bin/arm-none-linux-gnueabihf-g++ -std=c++11 \
-v -w -fexceptions -fpermissive --sysroot=$RPISYSROOT \
-pipe -mcpu=cortex-a72 -mfpu=neon-vfpv4 -mfloat-abi=hard -g \
-I . -I .. -I libA/include -I libB/include \
-I $ARMGCC/arm-none-linux-gnueabihf/libc/usr/include \
-I $RPISYSROOT/usr/include/arm-linux-gnueabihf \
-c file.cpp -o obj/debug/file.o
我收到以下错误:
$ARMGCC/arm-none-linux-gnueabihf/libc/usr/include/bits/mathcalls-helper-functions.h:20:24: error: ‘__fpclassify’ has not been declared
20 | __MATHDECL_ALIAS (int, __fpclassify,, (_Mdouble_ __value), fpclassify)
| ^~~~~~~~~~~~
我在 ARMGCC
、RPISYSROOT
和 Raspberry Pi 的 tools git repo 中看到了 __fpclassify
的使用,它们似乎都是相同文件的所有迭代:
usr/include/math.h
usr/include/bits/mathcalls-helper-functions.h
(路径可能略有不同)。但是,这些都没有提供__fpclassify
的声明或实现。这似乎来自libm
,我认为它已经成为libc
的一部分有一段时间了。我已经将libc 安装到RPISYSROOT
。
我发现的唯一实现来自 uCLibc,但我认为混合 libc 实现不是一个好主意。
另外,由于 Raspberry Pi 是 armhf,我应该看到这些错误吗?
【问题讨论】:
如果它是由libm
提供的,你可能需要在你的命令中使用-lm
链接它。
【参考方案1】:
这里的问题是混合了两组标头,即构建链 (ARMGCC
) 和指定系统根 (RPISYSROOT
) 的标头。特别是,假设 file.cpp
看起来像:
#include <cmath>
void function(void)
您的编译命令将执行以下嵌套包含:
$ARMGCC/arm-none-linux-gnueabihf/include/c++/10.3.1/cmath
$RPISYSROOT/usr/include/math.h
$ARMGCC/arm-none-linux-gnueabihf/libc/usr/include/bits/mathcalls-helper-functions.h
您收到的具体错误(提到__fpclassify
)有点误导,因为此时最相关未定义的是__MATHDECL_ALIAS
类似函数的宏,它在$ARMGCC/arm-none-linux-gnueabihf/libc/usr/include/math.h
中定义。
如果您查看RPISYSROOT
下的同一个文件,您会发现它使用了__MATHDECL_1
:
/* Classify given number. */
__MATHDECL_1 (int, __fpclassify,, (_Mdouble_ __value))
__attribute__ ((__const__));
在$RPISYSROOT/usr/include/math.h
中定义。
因此,您需要做的是确保包含 $RPISYSROOT/usr/include/arm-linux-gnueabihf/bits/mathcalls-helper-functions.h
而不是 ARMGCC
对应项,您可以通过更改编译命令中包含的顺序来做到这一点。将您的命令简化为基本要素,我们有:
$ARMGCC/bin/arm-none-linux-gnueabihf-g++ \
--sysroot=$RPISYSROOT \
-I $ARMGCC/arm-none-linux-gnueabihf/libc/usr/include \
-I $RPISYSROOT/usr/include/arm-linux-gnueabihf \
-c file.cpp \
-o obj/debug/file.o
如上失败。将其更改为:
$ARMGCC/bin/arm-none-linux-gnueabihf-g++ \
--sysroot=$RPISYSROOT \
-I $RPISYSROOT/usr/include/arm-linux-gnueabihf \
-I $ARMGCC/arm-none-linux-gnueabihf/libc/usr/include \
-c file.cpp \
-o obj/debug/file.o
编译成功。
事实上,对于这种情况,我们可以删除对任何 ARMGCC
的显式引用,如下所示:
$ARMGCC/bin/arm-none-linux-gnueabihf-g++ \
--sysroot=$RPISYSROOT \
-I $RPISYSROOT/usr/include/arm-linux-gnueabihf \
-c file.cpp \
-o obj/debug/file.o
也可以编译。
【讨论】:
我已经 solved 使用了 Raspberry Pi 的工具链和 Raspbian sysroot。以上是关于在 armhf 中没有实现 __fpclassify的主要内容,如果未能解决你的问题,请参考以下文章