编译错误:linux/module.h文件或目录不存在。

12

我写了一个简单的模块:

#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

有什么建议吗?

编辑: 我使用了这个命令:

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.

是的,我已经安装了内核头文件。 - Uzair Farooq
5个回答

11

首先,您需要获取内核源代码。许多人会混淆用户空间头文件和内核空间头文件,因为它们的文件夹结构大部分相同。大多数发行版只提供用户空间头文件而不是内核空间头文件。

一般来说,使用make来构建内核模块,而不是裸的cc。请按照简单的步骤,参考这里中所述的Hello World内核模块进行构建。


非常感谢...我制作了Makefile并且它起作用了。再次感谢。 - Uzair Farooq
@PavanManjunath 我按照教程创建了一个makefile,但是我收到了这个消息 make: Nothing to be done for `all'。我正在使用Ubuntu,并安装了Linux-header。 - user606669
1
你的问题可能有很多原因。看看这个链接是否有帮助 http://ubuntuforums.org/showthread.php?t=1795434 或者也许是这个 https://dev59.com/KGoy5IYBdhLWcg3wa9ff - Pavan Manjunath
谢谢,我会尝试并在这里发布结果。 - user606669

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创建make文件

首先,在终端上键入$(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

3

如果已安装,您需要内核头文件,它们通常位于/usr/include/中。

除非您使用基于源代码的发行版或自己构建了内核,否则它们通常不会默认安装; 使用您所使用的发行版的包管理器进行安装。该软件包通常称为linux-headers


不行,他需要内核的内部头文件,而不是那些导出到用户空间的头文件。 - Kristof Provost
我需要安装内核头文件吗?我在目录 /usr/include/ 中找不到 module.h 文件。 - Uzair Farooq
谢谢...我已经安装了内核头文件,但现在出现另一个错误,请查看更新后的问题。你能帮忙解决吗? - Uzair Farooq
我已经使用 make 文件使其工作。感谢您的帮助。 - Uzair Farooq

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

定义__KERNEL__MODULE也是无意义的,因为如果需要,kbuild已经设置了这些。


非常感谢...我使用了@Pavan Manjunath指向的教程中的make文件,它起作用了。 - Uzair Farooq

2
大多数Linux发行版默认不安装内核头文件。请查找一个名为kernel-headers或类似的软件包。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接