编译linux内核时#Include如何工作

时间:2013-04-18 14:35:27

标签: c linux

我需要使用arm-linux-gcc作为嵌入式系统编译2.6.28 linux内核。我正在运行Ubuntu 12.10 x86。 我查看了2.6内核源代码,发现了这个:

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

gcc编译器是否会在Linux_2.6.28源文件夹中包含来自/ usr / include / usr / local / include 的这些文件?

3 个答案:

答案 0 :(得分:6)

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

正如我在评论中建议的那样,只需看一下主要的Makefile。您将在源树的根目录下找到它。一点点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)

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

要查找某些给定编辑中包含的文件,请将-H传递给gcc

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