我是一个初学者,我正在尝试一些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。
最佳答案
您正在尝试使用纯gcc
编译模块,而没有
周围的kbuild框架。您可能已经在其中工作了
过去使用这种方法,但是尝试维护它是非常痛苦的可怕
使用除pure-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