如何正确使用Make的-C选项编译ArchLinux内核模块?
解决ArchLinux内核模块编译的Makefile找不到问题
问题原因
你用的命令逻辑是对的:-C /lib/modules/$(uname -r)/build已经让make切换到内核构建目录、使用那里的主Makefile;M=$(pwd)是告诉内核Makefile,你的模块源代码在当前工作目录。但报错的核心是:内核的主Makefile会去M指定的目录(也就是你的camera目录)找属于你这个模块的专属Makefile,而不是直接用内核自己的Makefile编译你的代码——你现在的camera目录里恰恰缺少这个模块Makefile。
解决步骤
- 确保你在模块代码所在目录:
cd /home/jenia/Documents/kernel-modules/camera
- 在该目录下创建模块专属的Makefile,内容如下(把
your_module.c替换成你的实际模块源代码文件名):
# 指定要编译的模块对象,比如你的代码是camera_patch.c,就写camera_patch.o obj-m += your_module.o # 内核构建目录路径 KDIR := /lib/modules/$(shell uname -r)/build # 当前模块目录路径 PWD := $(shell pwd) # 编译目标 all: make -C $(KDIR) M=$(PWD) modules # 清理目标 clean: make -C $(KDIR) M=$(PWD) clean
- 执行编译命令:
make -j4
或者你也可以直接用原来的命令,但前提是当前目录已经有这个模块Makefile。
额外说明
内核模块编译的机制是:用内核的主Makefile来驱动编译,但需要你在模块目录提供一个简单的Makefile,告诉内核要编译哪些对象文件。你之前的误解是以为要让make直接使用内核的Makefile,但实际是需要两者配合:内核主Makefile负责提供编译环境,模块目录的Makefile指定要编译的内容。
内容的提问来源于stack exchange,提问作者Jenia Be Nice Please
相关产品推荐
相关产品推荐

