You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Debian 9下编译内核模块报错求助:/build目录为空无Makefile

解决Debian 9编译内核模块时的"No rule to make target 'modules'"错误

首先,核心问题出在你的/lib/modules/4.9.0-5-amd64/build目录是空的——这说明你安装的内核头文件没有正确部署,或者这个目录的符号链接指向了错误的路径。咱们一步步来修复:

1. 重新安装并修复内核头文件

先彻底清理现有可能损坏的头文件,再重新安装:

sudo apt-get purge linux-headers-4.9.0-5-amd64
sudo apt-get autoremove --purge
sudo apt-get install linux-headers-$(uname -r)

安装完成后,检查build符号链接是否正确指向了实际的头文件目录:

ls -l /lib/modules/$(uname -r)/build

正常情况下,输出应该是类似这样的:

lrwxrwxrwx 1 root root 36 Aug 1 10:00 /lib/modules/4.9.0-5-amd64/build -> /usr/src/linux-headers-4.9.0-5-amd64

如果链接不存在或者指向错误,手动创建正确的链接:

sudo ln -sf /usr/src/linux-headers-$(uname -r) /lib/modules/$(uname -r)/build

2. 修复你的内核模块代码和Makefile

除了头文件的问题,你的代码和Makefile还有两个小细节需要修正:

代码中的语法错误

在你的C代码里,MODULE_VERSION("1.0")这一行末尾缺少分号,会导致编译失败,修改后应该是:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Homer S.");
MODULE_DESCRIPTION("hmmmm ...");
MODULE_VERSION("1.0");
static int __init start(void) {
    printk(KERN_INFO "\nCHELLAS!\n\n");
    return 0;
}
static void __exit end(void) {
    printk(KERN_INFO "\nCIAO!\n\n");
    return;
}
module_init(start);
module_exit(end);

Makefile的缩进问题

Makefile要求命令行必须用Tab键缩进(不能用空格),检查你Makefile里的all和clean目标下的make -C ...行,确保它们是用Tab缩进的。正确的Makefile应该是:

obj-m+=foo.o
KVERSION=$(shell uname -r)
all:
	make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules
clean:
	make -C /lib/modules/$(KVERSION)/build M=$(PWD) clean

3. 重新编译验证

完成以上修复后,回到你的模块目录,重新执行:

make

如果一切正常,应该会生成foo.ko文件,之后就可以用sudo insmod foo.ko加载模块,用dmesg查看内核打印的信息了。

内容的提问来源于stack exchange,提问作者Sven Hager

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 03:44:21