编译linux内核时#Include的工作原理

编译linux内核时#Include的工作原理,c,linux,C,Linux,我需要用ARMLinuxGCC作为嵌入式系统编译一个2.6.28Linux内核。我正在运行Ubuntu12.10x86。 我查看了2.6内核源代码,发现: #include <linux/errno.h> #include <linux/kernel.h> #include <linux/input.h> #include <asm/io.h> #include <asm/irq.h> ... #包括 #包括 #包括 #包括 #包括

我需要用ARMLinuxGCC作为嵌入式系统编译一个2.6.28Linux内核。我正在运行Ubuntu12.10x86。 我查看了2.6内核源代码,发现:

#include <linux/errno.h>
#include <linux/kernel.h>
#include <linux/input.h>
#include <asm/io.h>
#include <asm/irq.h>
...
#包括
#包括
#包括
#包括
#包括
...

gcc编译器是否会从/usr/include/usr/local/include或Linux_2.6.28源文件夹中包含这些文件

这些文件不应在/usr/local等中直接访问。如果可以,这是一个问题,因为您的内核将无法正确构建,除非它使用属于该内核的文件。随着内核的更新和改进,其中一些文件会定期更改


内核使用的文件位于
linux/include/…
目录中。编译器选项使用
-nostinc
避免搜索标准include位置,然后从内核源目录中添加适当的位置

这些文件不应在/usr/local等中直接访问。如果可以,这是一个问题,因为您的内核将无法正确构建,除非它使用属于该内核的文件。随着内核的更新和改进,其中一些文件会定期更改


内核使用的文件位于
linux/include/…
目录中。编译器选项使用
-nostinc
避免搜索标准include位置,然后从内核源目录中添加适当的位置

要了解某些给定编译包含哪些文件,请将
-H
传递到
gcc


要添加用于搜索包含文件的目录,请将
-I
somedir传递到
gcc
,例如
-I/usr/local/include/
;要删除目录或清除包含路径,需要执行以下操作。

要了解某些给定编译包含哪些文件,请将
-H
传递到
gcc

要添加用于搜索包含文件的目录,请将
-I
somedir传递到
gcc
,例如
-I/usr/local/include/
;可以删除目录或清除包含路径。

内核是自包含的。这意味着它不允许有任何外部依赖。换句话说,内核源代码树包含构建内核所需的所有材料。在其他任何地方寻找代码都没有意义

正如我在评论中所建议的,只需浏览一下主Makefile。您将在源代码树的根下找到它。一点带有“include”的
ctrl+f
,下面是我可以反馈给您的有趣的引语:

# Look for make include files relative to root of kernel src
MAKEFLAGS += --include-dir=$(srctree)
# .... Other stuff
# Use USERINCLUDE when you must reference the UAPI directories only.
USERINCLUDE    := \
    -I$(srctree)/arch/$(hdr-arch)/include/uapi \
    -Iarch/$(hdr-arch)/include/generated/uapi \
    -I$(srctree)/include/uapi \
    -Iinclude/generated/uapi \
    -include $(srctree)/include/linux/kconfig.h

# Use LINUXINCLUDE when you must reference the include/ directory.
# Needed to be compatible with the O= option
LINUXINCLUDE    := \
    -I$(srctree)/arch/$(hdr-arch)/include \
    -Iarch/$(hdr-arch)/include/generated \
    $(if $(KBUILD_SRC), -I$(srctree)/include) \
    -Iinclude \
    $(USERINCLUDE)
内核是自包含的。这意味着它不允许有任何外部依赖。换句话说,内核源代码树包含构建内核所需的所有材料。在其他任何地方寻找代码都没有意义

正如我在评论中所建议的,只需浏览一下主Makefile。您将在源代码树的根下找到它。一点带有“include”的
ctrl+f
,下面是我可以反馈给您的有趣的引语:

# Look for make include files relative to root of kernel src
MAKEFLAGS += --include-dir=$(srctree)
# .... Other stuff
# Use USERINCLUDE when you must reference the UAPI directories only.
USERINCLUDE    := \
    -I$(srctree)/arch/$(hdr-arch)/include/uapi \
    -Iarch/$(hdr-arch)/include/generated/uapi \
    -I$(srctree)/include/uapi \
    -Iinclude/generated/uapi \
    -include $(srctree)/include/linux/kconfig.h

# Use LINUXINCLUDE when you must reference the include/ directory.
# Needed to be compatible with the O= option
LINUXINCLUDE    := \
    -I$(srctree)/arch/$(hdr-arch)/include \
    -Iarch/$(hdr-arch)/include/generated \
    $(if $(KBUILD_SRC), -I$(srctree)/include) \
    -Iinclude \
    $(USERINCLUDE)

让我帮你查一下gccs手册,请稍等……显然不是!看看主Makefile,您将在内核源代码树的根目录中找到它。然后只需搜索“包含”。这将为您提供您正在寻找的答案;)内核不会像已经回答的那样查看本地文件。但是,如果您编译用户空间应用程序以在嵌入式系统中运行,则必须更改路径和/或手动将内核源目录传递给make命令。让我为您检查一下gccs手册,请稍候……显然不是!看看主Makefile,您将在内核源代码树的根目录中找到它。然后只需搜索“包含”。这将为您提供您正在寻找的答案;)内核不会像已经回答的那样查看本地文件。但是,如果编译用户空间应用程序以在嵌入式系统中运行,则必须更改路径和/或手动将内核源目录传递给make命令。这是一个很好的信息!我删除了我的答案,因为我显然没有抓住这一点。好消息!我删除了我的答案,因为我显然没有抓住那一点。