为什么 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 的位置)。
我编译了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 的位置)。