在linux上,在许多文件夹下都有socket.h,如下所示。
如何确定asm文件夹与linux vs bits之间存储的内容。我假设sys下的所有内容都只是libc
gcc以何种顺序解析头文件。例如,它是从sys中选择socket.h,然后是linux,然后是sys,然后选择等等吗?
/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中)
答案 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