如何为内核模块的Makefile添加包含路径

11

如何为内核模块的 Makefile 添加一个 include 路径?我想在 test_module.c 中包含 "test_kernel.h" 文件,而 "test_kernel.h" 文件位于其他目录 "inc" 中。

我在 Makefile 中尝试了以下解决方案,但它没有起作用:

obj-m += test_module.o

test_module:
    $(MAKE) -C "$(LINUX_DIR)" -Iinc $(MAKE_OPTS) modules
4个回答

19

在您的Makefile中应该使用EXTRA_CFLAGS。请尝试使用以下内容:

obj-m += test_module.o
EXTRA_CFLAGS=-I$(PWD)/inc

test_module:
    $(MAKE) -C "$(LINUX_DIR)" $(MAKE_OPTS) modules

可以查看第3.7节 编译标志,在这里
希望对你有所帮助!


4
这非常有用。阅读新版文档,现在似乎已经弃用了EXTRA_CFLAGS。您可以使用ccflags-y=-I$(PWD)/inc代替EXTRA_CFLAGS。 请查看此处的3.7节链接 - hesham_EE
EXTRA_CFLAGS 似乎也在工作。路径应该从内核构建目录(使用 -C 指定的目录)中指定。 - Chan Kim
文档明确提到:“具有相同行为的标志先前被命名为:EXTRA_CFLAGS、EXTRA_AFLAGS和EXTRA_LDFLAGS。它们仍然受支持,但使用已被弃用。” 您应该使用 ccflags-y - Roi

3
对我来说,许多尝试都失败了,直到其中一个成功为止。例如,在路径中使用$(src)可以在ccflags-y中实现它:
# Include Paths
ccflags-y       += -I$(src)/../../lib/include 

对于一个目录"/lib/include",它是源文件夹的两个级别之上。

这是从Kernel.org的声明中推出的。

始终使用$(src)来引用位于src树中的文件,特别是如果您的源代码位于Linux内核树之外的目录中。


是的,我尝试使用$(CURDIR)代替$(src),但它没有起作用。谢谢你提供的参考链接。 - goodman
是的,我尝试使用$(CURDIR)代替$(src),但它没有起作用。感谢您提供的参考链接。 - goodman

2

您确定在文件中正确指定了include吗?

例如:

#include "inc/something.h"

替代

#include <inc/something.h>

1

-I 是 GCC 的标志,而不是 Make 的标志。1 你需要将一个变量传递给你的“子”Make进程;可能是这样的:

$(MAKE) -C "$(LINUX_DIR)" CPPFLAGS="-Iinc" $(MAKE_OPTS) modules

CPPFLAGS是一个标准Make变量,用于隐式规则中。您可以自行使用其他变量,并确保在子Make中适当使用。

Make手册提供了更多关于在Make实例之间传递变量的详细信息:http://www.gnu.org/software/make/manual/make.html#Variables_002fRecursion


1. 实际上,它也是一个Make标志,但与此完全无关。


@MohamedKALLEL:是的,我稍微搞错了。我已经更新了我的回答。 - Oliver Charlesworth
@MohamedKALLEL:你的子Makefile是否使用C编译的默认规则?如果不是,显式规则是否使用了“CPPFLAGS”变量? - Oliver Charlesworth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接