#Include 在我编译 Linux 内核时如何工作

Posted

技术标签:

【中文标题】#Include 在我编译 Linux 内核时如何工作【英文标题】:how #Include works when I compile a linux kernel 【发布时间】:2013-04-11 17:46:00 【问题描述】:

我需要使用 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 编译器是否会包含来自 /usr/include /usr/local/include 来自 Linux_2.6.28 源文件夹的这些文件?

【问题讨论】:

让我帮你查一下gccs手册,等一下…… 显然不是!查看主 Makefile,您会在内核源代码树的根目录中找到它。然后只需搜索“包含”。这应该会给你你正在寻找的答案;) 内核不会像已经回答的那样查看您的本地文件。但是,如果您编译用户空间应用程序以在嵌入式系统中运行,则必须更改 PATH 和/或手动将内核源目录传递给 make 命令。 【参考方案1】:

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

正如我在 cmets 中所建议的,只需看一眼主 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)

【讨论】:

【参考方案2】:

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

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

【讨论】:

好资料!我已经删除了我的答案,因为我显然错过了这一点。【参考方案3】:

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

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

【讨论】:

以上是关于#Include 在我编译 Linux 内核时如何工作的主要内容,如果未能解决你的问题,请参考以下文章

编译linux内核2.4.0时内联汇编错误

如何编译出带有调试信息的内核模块

如何编译出带有调试信息的内核模块

如何编译一个linux下的驱动模块

linux内核移植编译时遇到的问题

如何获取linux内核线程的pid