(编译后的报错/警告记录)linux/module.h: 没有那个文件或目录/linux/module.h: No such file or directory

本文详细介绍在Ubuntu 16.04上安装Linux内核头文件和源代码的方法,包括使用apt-get命令安装所需软件包。同时,提供了一个简单的内核模块示例代码和Makefile配置,以及如何编译、加载和卸载模块的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

(转自,侵删)https://www.cnblogs.com/zhangjy6/p/5462644.html

缺少linux kernel 头文件

sudo apt-get install linux-headers-$(uname -r)

其中uname -r是显示系统信息

要在Ubuntu中安装整个Linux内核源代码

sudo apt-get install linux-source

一个简单的内核模块

#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);

Makefile文件(注意M要大写)

# at first type on ur terminal that $(uname -r) then u will get the version..
# that is using on ur system
 
obj-m += hello.o
 
KDIR =/usr/src/linux-headers-$(shell uname -r)
 
all:
        $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules
 
clean:
        rm -rf *.o *.ko *.mod.* *.symvers *.order

运行

$ sudo insmod hello.ko
$ dmesg           
$ sudo rmmod hello
$ dmesg

系统ubunttu16.04

<think>好的,我现在需要解决用户在编译Linux内核模块时遇到的错误:“linux/module.h: No such file or directory”。首先,我需要回忆一下这个错误的常见原因以及解决方法。根据用户提供的引用内容,特别是引用[4]和引用[5],看起来问题通常是由于缺少内核头文件导致的。 首先,我应该确认用户是否安装了正确的内核头文件包。在UbuntuDebian系统中,通常可以通过运行`sudo apt-get install linux-headers-$(uname -r)`来安装。这里`uname -r`会获取当前运行的内核版本,确保安装的headers与当前内核匹配,这一点很重要,因为版本匹配可能导致问题。 接下来,用户可能需要确认安装后的头文件路径是否正确。安装后的头文件通常位于`/usr/src/linux-headers-$(uname -r)/include`目录下。检查这个目录是否存在,并且其中是否包含所需的`linux/module.h`文件。如果路径正确但编译时仍然找到,可能需要调整Makefile中的包含路径,使用`-I`选项指定正确的路径,例如`-I/usr/src/linux-headers-$(uname -r)/include`。 另外,用户可能在编译没有使用正确的命令。编译内核模块通常需要使用`make`命令配合内核的构建系统,而是普通的`gcc`命令。用户应该编写一个合适的Makefile,其中指定内核的路径,比如: ``` obj-m += mymodule.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules ``` 这样可以确保编译时使用正确的内核配置和头文件。 还有一种可能是用户安装了错误版本的内核头文件。例如,如果系统内核更新过但未重启,者手动安装了同版本的头文件,都可能导致版本一致。这时需要检查`uname -r`的输出是否与已安装的headers版本一致,必要时更新系统并重启。 此外,用户可能需要确保他们的开发环境已正确安装,包括构建工具和依赖项。运行`sudo apt-get install build-essential`可以安装基本的编译工具,避免其他编译问题。 最后,如果所有步骤都正确但问题依旧,可能需要重新配置重新编译内核源代码。过这种情况较为少见,一般安装headers即可解决。 总结一下,解决步骤应该是:安装正确的内核头文件,检查路径,调整编译命令Makefile,确保版本一致,安装构建工具。根据用户提供的引用,特别是引用[4]和引用[5]中的建议,安装headers是最直接的解决办法,其他步骤作为补充。</think>要解决编译时出现的 `linux/module.h: No such file or directory` 错误,需按以下步骤操作: --- ### **1. 安装Linux内核头文件** 此错误通常因缺少内核头文件导致。在Ubuntu/Debian系统中,执行以下命令安装: ```bash sudo apt-get update sudo apt-get install linux-headers-$(uname -r) ``` 此命令会安装与当前运行的内核版本(`uname -r` 获取)匹配的头文件[^4]。 --- ### **2. 验证头文件路径** 安装完成后,检查头文件目录是否存在: ```bash ls /usr/src/linux-headers-$(uname -r)/include/linux/module.h ``` 若路径正确但编译报错,需在编译命令中添加头文件路径: ```bash gcc -I/usr/src/linux-headers-$(uname -r)/include -c mydev.c ``` 修改Makefile中的包含路径[^5]。 --- ### **3. 使用正确方式编译内核模块** 内核模块需通过内核构建系统编译,而非直接使用 `gcc`。创建以下内容的Makefile: ```makefile obj-m += mymodule.o all: make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules ``` 然后运行 `make` 命令编译。 --- ### **4. 确保内核版本一致性** 若系统内核已更新但未重启,可能导致版本一致。执行 `uname -r` 查看当前内核版本,并与已安装的headers对比: ```bash dpkg -l | grep linux-headers ``` 若版本匹配,需重启系统安装对应版本headers[^4]。 --- ### **5. 安装构建工具链** 确保已安装基础编译工具: ```bash sudo apt-get install build-essential ``` --- ### **总结** - **核心原因**:缺少与当前内核匹配的 `linux-headers` 包。 - **直接解决**:安装头文件并验证路径。 - **扩展场景**:若涉及自定义内核特殊配置,需手动指定源码路径[^5]。 ---
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值