如何在linux中组织头文件

时间:2012-12-06 17:50:21

标签: c linux

在linux上,在许多文件夹下都有socket.h,如下所示。

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

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

  3. /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中)

2 个答案:

答案 0 :(得分: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和链接列表中的其他目录。

答案 1 :(得分:1)

对于常规文件

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

gcc -M filename.c

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

对于系统文件

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

man socket

这应该会显示this之类的内容,这清楚地表明您要查找的文件是/usr/include/sys/socket.h