为什么stddef.h不在/ usr / include中?

我编译了gnu标准库并将其安装在$GLIBC_INST

现在,我尝试编译一个非常简单的程序(只使用一个#include: #include ):

 gcc --nostdinc -I$GLIBC_INST/include foo.c 

编译(预处理器?)告诉我,它没有找到stddef.h

事实上, $GLIBC_INST/include没有(在/usr/include也没有)。 但是,我在/usr/lib/gcc/x86_64-unknown-linux-gnu/5.3.0/include找到了一个stddef.h

为什么该文件不在/usr/include ? 我认为它属于标准c库,应该安装在$GLIBC_INST/include

如果没有stddef.h我怎么能用新安装的标准库编译我的foo.c

编辑:澄清

我觉得这个问题的标题不是最优的。 正如一些答案所指出的那样, stddef.h不需要在/usr/include (或者$GLIBC_INST/include ,就此而言)。 我明白这一点。

但是我想知道当我想使用$GLIBC_INST时我该怎么$GLIBC_INST 。 我似乎很明显(虽然我可能在这里错了)我需要使用--nostdinc调用gcc以便不使用系统安装的头文件。 这需要我使用-I$GLIB_INST/include 。 这对我来说很清楚。

然而,我还不清楚的是:当我还添加-I/usr/lib/gcc/x86..../include ,我怎么能确定我确实拥有新编译的glibc的最新头文件?

这是因为/usr/include下的文件是由C库提供的公共头文件,例如glibc ,而/usr/lib/gcc中的文件特定于该特定编译器。 通常每个编译器都有自己不同的stddef.h实现,但是当链接到已安装的C库时,它们将使用相同的stdio.h

当你说#include 它不要求/usr/include/stddef.h作为磁盘上的文件存在。 实现所需的只是#include 有效,并且它为您提供了标题为您提供的function。

在您的情况下,实现将其一些文件放在另一个搜索路径中。 这很典型。

为什么该文件不在/usr/include

因为绝对不需要在/usr/include/定位标准头文件。

实施可以将它们放在任何地方。 唯一的保证是当你执行#include ,编译器/预处理器正确定位并包含它。 由于您使用gcc的-nostdinc选项禁用了该选项,因此您可以自己(正确地给出该标头的位置)。