【问题标题】:gcc for ARM refuses to include Newlib standard directoriesARM 的 gcc 拒绝包含 Newlib 标准目录
【发布时间】:2020-07-07 16:34:01
【问题描述】:

我正在尝试与arm-none-eabi-gcc-9.2.x 进行交叉编译并遇到以下问题:

undefined symbol 'PRIu64'

(消息被我缩短为必要的最小值)这是由 Newlib 标头 inttypes.h 执行以下操作引起的:

#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 和一组 vanilla gcc 系统头文件一起发布,或者这种错误配置来自哪里?

【问题讨论】:

  • stdint 是 C 语言的一部分,并且来自编译器,因为编译器作者选择的 C 语言变量类型(long、short、int char)的大小不是 C 库或其他任何人。所以 newlib 不可能知道,你最好以某种方式使用提供的编译器。 gcc,任何人预先构建的任何特定都与newlib无关,就像要求“本田人”都使用固特异轮胎(两个独立的产品需要第三方组合)。 Newlib 当然可以添加更多的东西,但核心 C 语言的大小根据定义是特定于编译器的。
  • @old_timer 我不太清楚,我也认为这个星座“有点”偏离标准轨道,委婉地说。但是,ARM gcc 工具套件拥有如此庞大的用户群,我希望能得到更多说明,说明为什么选择了这种与常规程序的特殊偏差。

标签: c gcc arm header-files include-path


【解决方案1】:

确实,newlib 提供了&lt;stdint.h&gt;,而 gcc 也提供了它。因此,当&lt;inttypes.h&gt; 包括&lt;stdint.h&gt; 时,它不包括来自newlib 的&lt;stdint.h&gt;,而是来自gcc 的&lt;stdint.h&gt;。如果&lt;stdint.h&gt; 不定义&lt;inttypes.h&gt; 内部使用的一些宏,那也没什么大不了的。

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

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

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

【讨论】:

  • "fix newlib":是否真的推荐实践干预这种级别和重要性的第 3 方库?最小意外原则让我犹豫不决……或者您是否向 newlib 维护者解决了这个问题?
  • 事实上,在阅读了 Debian 的 bug 报告之后,我并不确定问题出在 newlib 端。
猜你喜欢
  • 1970-01-01
  • 2017-11-26
  • 1970-01-01
  • 1970-01-01
  • 2012-06-04
  • 1970-01-01
  • 2016-10-28
  • 2011-06-26
  • 2018-10-13
相关资源
最近更新 更多