gpt4 book ai didi

raspberry-pi - 没有在 armhf 中实现 __fpclassify

转载 作者:行者123 更新时间:2023-12-04 17:15:20 28 4
gpt4 key购买 nike

我正在使用 ARM 的 10.3-2021.07 GCC toolchain 交叉编译 Raspberry Pi 4B (特别是 this 文件未压缩到 ARMGCC)。我也在使用最新的 Raspberry 操作系统 image作为 sysroot(循环安装到 RPISYSROOT)。主机是 Windows 主机上的 Ubuntu Xenial VM。

使用此编译行时(为便于阅读而编辑,CFLAGS 受 Pi 的 /proc/cpuinfogentooGNU 启发):

${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)
| ^~~~~~~~~~~~

我在 ARMGCCRPISYSROOT 和 Raspberry Pi 的 tools 中看到了 __fpclassify 的使用git repo,它们似乎是相同文件的所有迭代:

usr/include/math.h
usr/include/bits/mathcalls-helper-functions.h

(路径可能略有不同)。但是,这些都没有提供 __fpclassify 的声明或实现。这似乎来自 libm,我认为它已经成为 libc 的一部分一段时间了。我已经安装了 libcRPISYSROOT
我发现的唯一实现来自 uCLibc但我认为混合 libc 实现不是一个好主意。

此外,由于 Raspberry Pi 是 armhf,我应该看到这些错误吗?

最佳答案

这里的问题是两组 header 的混合,构建链的 header (ARMGCC) 和指定系统根 (RPISYSROOT) 的 header 。特别是,假设一个 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

它也可以编译。

关于raspberry-pi - 没有在 armhf 中实现 __fpclassify,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68801367/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com