我正试图与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和一组普通的gcc系统头,或者这种错误配置是从哪里来的?
发布于 2021-06-08 16:35:25
事实上,newlib提供<stdint.h>,而gcc也提供它。因此,当<inttypes.h>包含<stdint.h>时,它不包括来自newlib的<stdint.h>,而是包含来自gcc的<stdint.h>。如果<stdint.h>不定义<inttypes.h>内部使用的宏,那就没什么大不了的了。
最好的方法是修复newlib、更改编译器或修补系统标头。
如果不可能,可以在<sys/types.h>之前包含<inttypes.h>。<sys/types.h>包括定义必要宏的<_stdint.h>。
看来这个问题是由Debian:https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=953844提供的“无臂gcc”所特有的。
https://stackoverflow.com/questions/62779900
复制相似问题