2

在linux上,很多文件夹下都有socket.h,如下图。

  1. 如何决定存储在 asm 文件夹下 vs linux vs bits 下的内容。我假设 sys 下的所有内容都只是 libc

  2. gcc 以什么顺序解析头文件。例如,它是否从 sys 中选择 socket.h,然后是 linux,然后是 sys,然后是 bits 等等?

/usr/include/sys/socket.h,(由 libc 使用)

/usr/include/linux/socket.h

/usr/include/asm/socket.h

/usr/include/asm-generic/socket.h

/usr/include/bits/socket.h(包含在 libc 中)

4

2 回答 2

4

1) 裸机#include <socket.h>在默认的 linux 配置中不起作用:

fatal error: socket.h: No such file or directory

这意味着您还必须在 gcc 搜索路径中指定目录的子目录:(#include <sys/socket.h>相对于/usr/include,所以绝对路径是/usr/include/sys/socket.h)。要确定要使用的头文件,请查看man socket.

通常/usr/include/sys包含最终用户标头,而bits/asm包含中间标头,由 gcc 和其他标头使用。/usr/include/linux包含特定于 Linux 的头文件(通常与内核共享,因此它是对可能对用户空间编程有用的内核结构的描述)。

Libc 头文件通常分散在整个 /usr/include 中。特定于 Gcc 的标头通常位于诸如此类的地方/usr/include/x86_64-linux-gnu

2) 在这里: http: //gcc.gnu.org/onlinedocs/cpp/Search-Path.html您可以找到有关 GCC 搜索路径的更多信息。没有搜索任何猜测的目录,只是/usr/include链接列表中的其他目录。

于 2012-12-08T21:13:58.443 回答
1

对于一般文件

如果您使用 gcc 编译器,这很容易做到

gcc -M filename.c

这应该会显示已编译文件的完整依赖项列表。它将包括编译中包含的所有头文件的完整路径。

对于系统文件

另一方面,如果您正在寻找系统头文件,socket.h例如,您应该查看 socket 的手册页

man socket

这应该向您显示类似这样的内容,这很清楚您要查找的文件是/usr/include/sys/socket.h

于 2012-12-08T20:32:50.683 回答