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

6 c++ linux gcc makefile header-files

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

/usr/src/linux-headers-2.6.35-28-generic
Run Code Online (Sandbox Code Playgroud)

你好ç:

#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");
}
Run Code Online (Sandbox Code Playgroud)

和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
Run Code Online (Sandbox Code Playgroud)

make时出错:

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

我该如何解决这个问题?

sar*_*old 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
Run Code Online (Sandbox Code Playgroud)

请相信我; 虽然你可能认为自己"只是一个小小的改变" Makefile,但即使是内核版本的微小改动也会彻底破坏你的构建.现在花点时间为你的模块写一个Kbuild兼容Makefile的.我浪费了几周的生命,试图在引入基础设施Makefile时保持预先存在Kbuild.每一个新内核都让我失去了数小时的生产力.


Zul*_*jin 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
Run Code Online (Sandbox Code Playgroud)