错误编译:linux / module.h:没有这样的文件或目录

时间:2012-04-12 14:53:38

标签: c++ c linux compilation kernel

我写了一个简单的模块:

#define __KERNEL__
#define MODULE
#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");
}

并使用此命令进行编译:

cc -c hello.c

但是我收到了这个错误:

 linux/module.h: No such file or directory

有什么建议吗?

编辑: 我用过这个commad:

cc -I/usr/src/linux-headers-3.0.0-17-generic/include -c hello.c

它向前迈出了一步,现在我收到了这个错误:

In file included from /usr/src/linux-headers-3.0.0-17-generic/include/linux/kernel.h:13:0,
                 from hello.c:3:
/usr/src/linux-headers-3.0.0-17-generic/include/linux/linkage.h:5:25: fatal error: asm/linkage.h: No such file or directory
compilation terminated.

5 个答案:

答案 0 :(得分:10)

首先你需要 kernel sources 。许多人混淆了用户空间头和内核空间头,因为其中许多头具有相同的文件夹结构。大多数发行版只有用户空间标题而不是内核空间标题。

通常 make用于构建内核模块,而不是裸cc。按照给出here

的简单步骤解释Hello World内核模块

答案 1 :(得分:4)

源文件名是basic.c

#include <linux/init.h>
#include <linux/module.h>
/*MODULE_LICENSE("Dual BSD/GPL");*/
static int hello_init(void)
{
    printk(KERN_ALERT "Hello, world\n");
    return 0;
}
static void hello_exit(void)
{
    printk(KERN_ALERT "Goodbye, cruel world\n");
}
module_init(hello_init);
module_exit(hello_exit);

=====================================

现在为ubuntu

制作文件

首先在你的终端上键入$(uname -r)然后你将得到版本.. 在你的系统上使用

obj-m +=basic.o

KDIR =//usr/src/linux-headers-3.13.0-44-generic

all:
 $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
clean:
 rm -rf *.o *.ko *.mod.* *.symvers *.order

=============================================== =

运行代码

$sudo insmod basic.ko
$dmesg
u will get the output
$sudo rmmod basic.ko
$dmesg

答案 2 :(得分:3)

你需要内核头文件;如果安装,它们通常在/usr/include/

除非你使用基于源代码的发行版或构建自己的内核,否则它们很有可能在默认情况下没有安装;使用您的发行版包管理器来安装它们。该包通常称为linux-headers

答案 3 :(得分:3)

你需要内核构建环境(选择脚本,头文件和Makefile),如果安装了内核,通常可以通过/ lib / modules / 版本 / build(它的符号链接)访问它已经。否则,该目录是构建目录(System.map所在的目录)。完整的来源需要(智能发行版认识到这一点),也不是/ usr / include / whatever。

必须使用kbuild;调用cc -I是不够的,并且已经超过10年了。您从Kbuild文件开始:

obj-m += mymodule.o

Makefile

kdir=/lib/modules/$(shell uname -r)/build
all:
        make -C ${kdir} M=$$PWD
modules_install clean:
        make -C ${kdir} M=$$PWD $@

然后使用make

#defining __KERNEL__MODULE也毫无意义,因为如果需要,已经由kbuild设置了。

答案 4 :(得分:2)

大多数Linux发行版都不会默认安装内核头文件。查找包kernel-headers或类似的东西。