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

Why is stddef.h not in /usr/include?

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

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

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

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

确实,$GLIBC_INST/include 中有 none(/usr/include 中也没有)。但是,我在 /usr/lib/gcc/x86_64-unknown-linux-gnu/5.3.0/include.

中发现了一个 stddef.h

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

当我的 foo.c 似乎没有 stddef.h 时,如何使用新安装的标准库编译它?

编辑:澄清

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

但我想知道当我想使用 $GLIBC_INST 时如何进行。对我来说很明显(虽然我在这里可能是错的)我需要用 --nostdinc 调用 gcc 以便不使用系统安装的 header 文件。 这意味着我使用 -I$GLIB_INST/include。我很清楚。

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

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

当您说 #include <stddef.h> 时,它根本不需要 /usr/include/stddef.h 作为文件存在于磁盘上。实施所需的全部条件是 #include <stddef.h> 有效,并且它为您提供 header 旨在为您提供的功能。

在您的例子中,该实现将它的一些文件放在另一个搜索路径中。这很典型。

Why is that file not under /usr/include?

因为绝对没有要求标准 header 位于 /usr/include/

实施可以将它们放置在任何地方。唯一的保证是 当您执行 #include <stddef.h> 时,compiler/preprocessor 会正确定位并包含它。由于您使用 gcc 的 -nostdinc 选项禁用了它,因此您只能靠自己(正确给出 header 的位置)。