为什么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
选项禁用了该选项,因此您可以自己(正确地给出该标头的位置)。