ARM 的 gcc 拒绝包含 Newlib 标准目录

gcc for ARM refuses to include Newlib standard directories

我正在尝试 cross-compile 与 arm-none-eabi-gcc-9.2.x 并遇到以下问题:

undefined symbol 'PRIu64'

(消息被我缩短到必要的最小值)这是由 Newlib header inttypes.h 做 a:

引起的
#include <stdint.h>

这促使 gcc 将其板载 stdint.h 来自

/usr/lib/gcc/arm-none-eabi/9.2.1/include

而不是

中的 Newlib
/usr/include/newlib

从而中断编译并出现上述错误。 当然,我首先尝试使用通常的

作为包含路径搜索的前缀
arm-none-eabi-gcc-9.2.1 -I/usr/include/newlib ...

但令我大吃一惊的是,gcc 向我吐了口水(通过 -xc -E -v):

ignoring duplicate directory "/usr/include/newlib"
   as it is a non-system directory that duplicates a system directory

只有一个

arm-none-eabi-gcc-9.2.1 -isystem /usr/include/newlib ...

说服它在搜索中包括 Newlib 目录。

这是因为安装错误吗? gcc 怎么敢 包含我提供的路径?

ARM 人员是否将他们的 gcc 与 Newlib 和一套香草 gcc 系统 header 一起发布,或者这种错误配置从何而来?

的确,newlib提供了<stdint.h>,而gcc也提供了。因此,当 <inttypes.h> 包含 <stdint.h> 时,它不包含来自 newlib 的 <stdint.h>,而是来自 gcc 的 <stdint.h>。如果 <stdint.h> 不定义 <inttypes.h>.

内部使用的一些宏,那也没什么大不了的

最好的办法是修复 newlib,更改编译器或修补系统头文件。

如果不可能,您可以在 <inttypes.h> 之前添加 <sys/types.h><sys/types.h> 包括定义必要宏的 <_stdint.h>

看来是 Debian 提供的 arm-none-gcc 特有的问题: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=953844