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

时间:2011-04-10 10:50:51

标签: c++ linux gcc makefile header-files

我将在Ubuntu 10.10(内核2.6.35-28-generic)中编写Hello World模块。标题位于:

/usr/src/linux-headers-2.6.35-28-generic

的hello.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");
}

和Makefile:

CC = gcc
CFLAGS = -Wall -DMODULE -D__KERNEL__
hello.o: hello.c
    $(CC) $(CFLAGS) -c hello.c
    echo insmod hello.o to install
    echo rmmod to delete

制作

时出错
  

hello.c:1:致命错误:linux / kernel.h:没有这样的文件或目录   编译终止。

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:7)

你不能只使用传统风格的Makefile与Linux内核模块;当你可能能够迫使某些事情发挥作用时,这将是一次痛苦的经历。

首先阅读Documentation/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。在引入Makefile基础设施时,我浪费了几周时间来维持预先存在的Kbuild。每一个新内核都会让我失去小时的生产力。

答案 1 :(得分:2)

你有/ usr / src / linux符号链接到你的/usr/src/linux-headers-2.6.35-28-generic? 如果没有,则使用以下命令创建一个

# cd /usr/src
# ln -sfn linux-headers-2.6.35-28-generic linux

答案 2 :(得分:2)

对我来说,这个文件(“linux / kernel.h”)位于linux-libc-dev包中(Kubuntu 10.10)。

答案 3 :(得分:2)

正如@sarnold所说,你应该使用不同的Makefile.Just如下:

  

obj-m + = hello.o

     

所有:       make -C / lib / modules / $(shell uname -r)/ build M = $(PWD)modules

并使用命令:

  

insmod hello.ko

安装此模块。