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

如何编写适配多文件内核模块的Makefile?

多文件Linux内核模块Makefile编写及原单文件脚本原理解析

一、原单文件Makefile原理拆解

你的单文件Makefile能正常运行,是完全遵循了Linux内核模块的标准构建规则,各部分作用清晰:

  • obj-m += f.o:告诉内核构建系统,要生成名为f.ko的可加载内核模块,该模块由f.o这一个目标文件编译链接而成。obj-m是内核构建体系专属的变量,专门用来指定要编译成可加载模块的目标。
  • all:目标:
    • make -C /lib/modules/$(shell uname -r)/build:-C参数让make工具切换到当前运行内核对应的源码构建目录,这个目录里包含了适配当前内核的编译规则、头文件和配置,确保模块用正确的环境编译。
    • M=$(PWD):告诉内核构建系统,你的模块源码存放在当前工作目录,编译完成后会把生成的.ko等产物放回这个目录。
    • modules:是内核构建系统内置的目标,执行它会完成指定目录下模块的编译工作。
  • clean:目标:调用内核构建系统的clean目标,自动清理当前目录下的编译产物,比如.o、.ko、.mod.c这类临时文件。

二、多文件内核模块的Makefile修改

针对你的场景(F.c调用A/B/C.h,每个头文件对应X.c实现),只需要在原Makefile基础上添加依赖的目标文件列表即可,修改后的脚本如下:

# 指定要生成的模块为f.ko
obj-m += f.o
# 声明f.ko需要链接的所有目标文件(f.o是主模块文件,a/b/c.o是依赖的实现文件)
f-objs := a.o b.o c.o

all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

关键细节说明:

  • f-objs := a.o b.o c.o:内核构建系统会识别「模块名+-objs」的命名规则,意思是f.ko需要把f.o和列表里的a.o、b.o、c.o全部链接起来。
  • 头文件(A.h/B.h/C.h)不需要在Makefile里显式声明,只要你在对应的.c文件里用#include引入,内核构建系统默认开启了依赖追踪,会自动处理头文件的引用关系。

三、实操注意事项

  • 确保F.c、A.c、B.c、C.c和Makefile都在同一目录下;
  • 编译前要安装当前内核的开发包(比如linux-headers-$(uname -r)),否则会找不到内核头文件导致编译失败;
  • 执行make用普通用户权限即可,但加载模块(insmod f.ko)需要root权限。

内容的提问来源于stack exchange,提问作者Its me

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 08:46:13