我是初学者,我正在尝试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#include 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框架.你可能已经得到了一些在使用这种方法在过去的工作,但它是痛苦的可怕可怕尝试使用除纯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
安装包kernel-devel:
yum install kernel-devel
在那之后,你应该:
/usr/src/kernels/$kernelversion/include/linux/module.h
然后你可以传递类似的东西:
-I/usr/src/kernels/$(uname -r)/include
到编译器