我编译了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的最新头文件?
答案 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
选项禁用了该功能,因此您可以自行设置(正确指定该标头的位置)。