C++ linux/kernel.h:没有这样的文件或目录
我将在Ubuntu10.10(内核为2.6.35-28-generic)中编写一个Hello World模块。标题位于:C++ linux/kernel.h:没有这样的文件或目录,c++,linux,gcc,makefile,header-files,C++,Linux,Gcc,Makefile,Header Files,我将在Ubuntu10.10(内核为2.6.35-28-generic)中编写一个Hello World模块。标题位于: /usr/src/linux-headers-2.6.35-28-generic 你好,c: #include <linux/kernel.h> #include <linux/module.h> int init_module(void) { printk("Hello, world\n"); return 0; } void
/usr/src/linux-headers-2.6.35-28-generic
你好,c:
#include <linux/kernel.h>
#include <linux/module.h>
int init_module(void)
{
printk("Hello, world\n");
return 0;
}
void cleanup_module(void)
{
printk("Goodbye\n");
}
生成时出错:
hello.c:1:致命错误:linux/kernel.h:没有这样的文件或目录
编译终止
如何解决此问题?您是否有指向/usr/src/linux-headers-2.6.35-28-generic的/usr/src/linux符号链接? 如果没有,则使用以下命令创建一个
# cd /usr/src
# ln -sfn linux-headers-2.6.35-28-generic linux
对我来说,这个文件(“linux/kernel.h”)在linux-libc-dev(Kubuntu 10.10)包中。你不能只使用传统风格的
Makefile
和linux内核模块;虽然你可能会强迫某些东西工作,但这将是一次痛苦的经历
首先阅读文档/kbuild/modules.txt
文件;它将准确地描述您在编写模块Makefile
时需要做什么,以便它可以灵活地挂接到内核的Kbuild
环境中。您的Makefile
可能会如下所示:
ifneq ($(KERNELRELEASE),)
# kbuild part of makefile
obj-m := 8123.o
8123-y := 8123_if.o 8123_pci.o 8123_bin.o
else
# normal makefile
KDIR ?= /lib/modules/`uname -r`/build
default:
$(MAKE) -C $(KDIR) M=$$PWD
# Module specific targets
genbin:
echo "X" > 8123_bin.o_shipped
endif
请相信我;虽然您可能会认为,让自己的
Makefile
正常工作只是“一个小小的改变”,但即使是内核版本中的微小更改,也会再次彻底破坏您的构建。现在花一个小时为您的模块编写一个兼容的Kbuild
Makefile
。当引入Kbuild
基础设施时,我浪费了数周的时间试图维护一个预先存在的Makefile
。每一个新内核都会让我损失数小时的工作效率。正如@sarnold所说,您应该使用不同的Makefile。如下所示:
obj-m+=hello.o
全部:
make-C/lib/modules/$(shell uname-r)/buildm=$(PWD)模块
并使用以下命令:
insmod hello.ko
安装此模块。我创建了:ivan@ivan-MS-N031:/usr/src$ls-l总计73080 lrwxrwxrwx 1根src 31 2011-04-10 14:57 linux->linux-headers-2.6.35-28-generic但仍出现错误…Ooops。。。在
#include
中有空格字符(“”),因为我刚刚用简单的驱动程序示例从HTML页面复制了代码。第二个问题由我标记为解决方案的答案解决。检查您创建的链接是否有效并遵循正确的路径,检查路径/usr/src/linux headers-$(uname-r)是否存在。
ifneq ($(KERNELRELEASE),)
# kbuild part of makefile
obj-m := 8123.o
8123-y := 8123_if.o 8123_pci.o 8123_bin.o
else
# normal makefile
KDIR ?= /lib/modules/`uname -r`/build
default:
$(MAKE) -C $(KDIR) M=$$PWD
# Module specific targets
genbin:
echo "X" > 8123_bin.o_shipped
endif