如何使用CMake构建Linux内核模块的配置指南

来源:Golang编程网作者:韦伯头衔:草根站长
导读:本期聚焦于小伙伴创作的《如何使用CMake构建Linux内核模块的配置指南》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《如何使用CMake构建Linux内核模块的配置指南》有用,将其分享出去将是对创作者最好的鼓励。

Linux内核模块的常规构建方式是通过编写Makefile调用内核构建系统完成,不过CMake作为通用的构建工具,也可以通过合理的配置实现对Linux内核模块的构建管理,适配习惯CMake工作流的开发场景。

如何使用CMake构建Linux内核模块的配置指南

环境准备

在使用CMake构建Linux内核模块前,需要先准备好对应的运行环境,确保相关依赖已经安装完成。

  • 安装对应版本的Linux内核头文件,需要和当前运行的内核版本匹配,一般可以通过系统包管理器安装,比如在Ubuntu系统中执行sudo apt install linux-headers-$(uname -r)
  • 安装CMake工具,建议版本不低于3.10,确保支持自定义命令和变量配置
  • 准备一个基础的内核模块源码文件,用于后续构建测试

核心CMake配置文件编写

CMake本身不直接支持内核模块构建,需要通过调用内核的构建命令来实现,核心是编写CMakeLists.txt文件,配置内核源码路径、模块名称、源码文件等信息。

基础配置项说明

首先需要定义项目名称和CMake的最低版本要求,然后获取当前运行内核的源码路径,通常内核头文件会安装在/lib/modules/$(uname -r)/build目录下。

完整配置示例

以下是一个基础的CMakeLists.txt配置示例,假设内核模块源码为hello_module.c

cmake_minimum_required(VERSION 3.10)
project(hello_kernel_module)

# 设置内核构建目录路径
set(KERNEL_DIR /lib/modules/${CMAKE_HOST_SYSTEM_VERSION}/build)
# 如果无法自动获取内核版本,也可以手动指定,比如set(KERNEL_DIR /lib/modules/5.4.0-150-generic/build)

# 定义内核模块名称
set(MODULE_NAME hello_module)

# 内核模块的源码文件
set(MODULE_SRCS hello_module.c)

# 添加自定义命令,调用内核Makefile构建模块
add_custom_command(
    OUTPUT ${MODULE_NAME}.ko
    COMMAND make -C ${KERNEL_DIR} M=${CMAKE_CURRENT_BINARY_DIR} modules
    DEPENDS ${MODULE_SRCS}
    COMMENT "Building kernel module ${MODULE_NAME}"
)

# 添加自定义目标,触发模块构建
add_custom_target(kernel_module ALL DEPENDS ${MODULE_NAME}.ko)

# 配置模块源码的编译参数,传递给内核构建系统
set(EXTRA_CFLAGS "-Wall -Wextra")
# 生成内核模块需要的Makefile片段,供内核构建系统使用
file(WRITE ${CMAKE_CURRENT_BINARY_DIR}/Makefile
    "obj-m := ${MODULE_NAME}.on"
    "EXTRA_CFLAGS := ${EXTRA_CFLAGS}n"
)

对应的hello_module.c测试源码示例如下:

#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>

static int __init hello_init(void) {
    printk(KERN_INFO "Hello, kernel module loadedn");
    return 0;
}

static void __exit hello_exit(void) {
    printk(KERN_INFO "Hello, kernel module unloadedn");
}

module_init(hello_init);
module_exit(hello_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("test");
MODULE_DESCRIPTION("Simple hello kernel module");

构建与验证流程

完成配置后,就可以执行构建命令验证配置是否正确。

构建步骤

CMakeLists.txt所在目录执行以下命令:

mkdir build && cd build
cmake ..
make

如果配置正确,构建目录下会生成hello_module.ko文件,这就是编译完成的内核模块。

模块验证

可以使用以下命令加载和卸载模块,验证功能是否正常:

# 加载模块
sudo insmod hello_module.ko
# 查看模块日志
dmesg | tail -n 5
# 卸载模块
sudo rmmod hello_module
# 再次查看日志
dmesg | tail -n 5

常见问题与解决

问题现象可能原因解决方法
提示找不到内核构建目录内核头文件未安装或路径配置错误检查KERNEL_DIR路径是否正确,确认内核头文件已安装
模块编译报错语法错误内核版本和头文件版本不匹配安装和当前运行内核版本一致的内核头文件
生成的ko文件无法加载编译时使用的内核配置和当前运行内核不一致确保内核构建目录是对应运行内核的目录,不要混用不同版本的内核路径

注意事项

使用CMake构建Linux内核模块时,本质还是调用内核自带的构建系统,CMake只是做了流程管理,因此内核模块的许可证、依赖等要求仍然需要遵守。另外如果需要构建多个内核模块或者复杂的模块依赖,可以在CMakeLists.txt中扩展自定义命令和目标的配置,适配更复杂的场景。

CMakeLinux内核模块kernel_module构建配置Makefile修改时间:2026-06-21 00:15:30

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。