linux / module.h:没有这样的文件或目录

时间:2011-11-09 09:10:25

标签: linux-kernel kernel

我是初学者,我正在尝试linux中的一些内核编程基础知识。今天早上我在VIM中打开了module.h文件,关闭后也没有保存任何更改。之后,我无法编译任何代码。我收到以下错误消息

[root@localhost helloworld]# cc helloworld.c
helloworld.c:1:25: error: linux/module.h: No such file or directory
[root@localhost helloworld]# 

这是一个成功运行到最后一天的示例代码。

#include<linux/module.h>
#include<linux/kernel.h>

int init_module(void)
{
        printk("HELLO WORLD");
        return 0;
}

void cleanup_module(void)
{
        printk("GOODBYE");
}

我搜索了如下的module.h文件,它确实存在

[root@localhost usr]# find . -name module.h
./src/kernels/2.6.18-194.el5-i686/include/asm-x86_64/module.h
./src/kernels/2.6.18-194.el5-i686/include/asm-i386/module.h
./src/kernels/2.6.18-194.el5-i686/include/linux/module.h
./include/sepol/policydb/module.h
./include/sepol/module.h
./include/kde/kunittest/module.h
[root@localhost usr]# 

请帮帮我。 我在虚拟盒子里使用CentOS。

3 个答案:

答案 0 :(得分:25)

您正在尝试使用普通gcc编译您的模块 周围的kbuild框架。你可能已经有了一些工作 过去采用这种方法,但尝试维持是非常可怕的 使用除纯kbuild Makefile方法之外的任何模块的模块。我有 浪费了我太多的生命与kbuild作斗争,我不希望这样做 发生在你身边 - 拥抱kbuild并让它帮助你构建你的模块。请 在编写另一行代码之前阅读Documentation/kbuild/modules.txt

您需要做的是为您的模块创建Makefile。它的内容应该 看起来像这样:

ifneq ($(KERNELRELEASE),)
# kbuild part of makefile
obj-m  := modulename.o

else
# normal makefile
    KDIR ?= /lib/modules/`uname -r`/build

default:
$(MAKE) -C $(KDIR) M=$$PWD

endif

我知道这比你过去看到的大多数Makefile要复杂得多, 但它有两个目的。如果你只是在你的目录中运行make,它就会 重新调用make以使用当前运行的内核中的kbuild机制 (假设至少有一个从/lib/modules/.../build到符号链接的符号链接 正确的位置)。

重新调用的make命令($(MAKE))将正确构建您的模块和 为您节省更多时间。 (真)。

在完成这项工作时,请Documentation/kbuild/modules.txt站在你身边。

注意:您可以在Documentation/kbuild/modules.txt

的Linux系统上找到/usr/share/linux-headers-$(uname -r)/Documentation/kbuild/modules.txt

答案 1 :(得分:6)

安装包kernel-devel:

yum install kernel-devel

之后,您应该:

/usr/src/kernels/$kernelversion/include/linux/module.h

然后您可以传递类似:

-I/usr/src/kernels/$(uname -r)/include

到编译器

答案 2 :(得分:0)

你可能需要一个Makefile来编译你的模块。我已经在我的个人计算机上试过了(Ubuntu 10.04.4),我在使用gcc -c hello.c时遇到了同样的问题,但是使用Makefile,一切都将是OK.kernel vesion是2.6.32-54-generic