【发布时间】: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