C 如何确定在特定构建中使用哪个版本的内核头文件

C 如何确定在特定构建中使用哪个版本的内核头文件,c,linux,build,linux-kernel,header-files,C,Linux,Build,Linux Kernel,Header Files,我试图理解Linux内核,所以我正在阅读Linux内核源代码。那么,由于有许多头文件具有相同的名称,但位于不同的目录中,因此如何确定头文件的位置呢 示例:它们包括fs/open.c中的fcntl.h 我可以在17个不同的目录中找到fcntl.h arch/alpha/include/asm/fcntl.h arch/arm/include/asm/fcntl.h .... 在手册页中查找头文件的名称…或用谷歌搜索它。通常,它将取决于文件的方式。如果包含如下引号: #include "Quote

我试图理解Linux内核,所以我正在阅读Linux内核源代码。那么,由于有许多头文件具有相同的名称,但位于不同的目录中,因此如何确定头文件的位置呢

示例:它们包括fs/open.c中的fcntl.h

我可以在17个不同的目录中找到fcntl.h

arch/alpha/include/asm/fcntl.h
arch/arm/include/asm/fcntl.h
....

在手册页中查找头文件的名称…或用谷歌搜索它。

通常,它将取决于文件的方式。如果包含如下引号:

#include "QuotedHeader.h"
#include <BracketedHeader.h>
它应该在同一个目录中。(也可以在“包含”目录中。)
如果包括角括号,如下所示:

#include "QuotedHeader.h"
#include <BracketedHeader.h>
#包括
它位于一个“包含”目录中。这些目录是编译器在编译时被告知搜索头文件的目录。这些可以作为参数传递,也可以在环境变量中设置

对于提供的示例,目录清楚地说明了存在重复项的原因:通常,不同体系结构特定的文件由以不同名称命名的文件夹分隔。
在提供的示例中,您看到的是和体系结构的不同fcntl.h文件。编译器将使用的文件取决于正在编译的CPU,编译器将在编译时被告知要使用哪个文件


在我个人看来,如果您还不知道这一点,那么您可能从错误的地方开始理解linux内核。试着先研究一下C

你可以添加到控制你的内核模块编译的
CFLAGS
。特别是,
-H
选项(传递到
gcc
)显示每个
#include
-d头的路径,
-I
选项增加了搜索的include目录列表。

您列出的示例对于各种类型的处理器都是唯一的,可能只有一个(或最多两个)其中一个可能的候选者将被给定硬件的构建使用。但是,也可能存在其他可能性,有时难以确定使用哪种方法,例如,将有一个C库的派生副本供用户空间程序链接,该副本将匹配内核源代码中特定于体系结构的副本的详细信息。如果您礼貌地询问,大多数编译器都会让您知道他们正在搜索的位置。gcc
——verbose
我想就是这样。这绝对是一个真实的问题,涵盖了一个真实而频繁的问题。我只能假设那些关闭它的人从未尝试过修改内核模块。我绝对同意个人的观点。内核源代码非常复杂,在深入研究C编程之前,您应该非常精通C编程。首先,试着理解一些应用程序(例如shell的源代码)是如何编译的,以及它的源代码是如何设计的。也读一些其他的好书。