#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 内核时如何工作的主要内容,如果未能解决你的问题,请参考以下文章