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

时间:2016-05-11 09:38:50

标签: c gcc c-preprocessor

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

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

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

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

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

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

如果使用新安装的标准库,我怎样才能编译foo.c stddef.h

修改:澄清

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

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

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

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:3)

  

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

因为标准标题绝对不需要位于/usr/include/

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