如何在Yocto(dunfell分支)中不依赖Bitbake编译外部内核模块
解决Yocto镜像内直接编译外部内核模块的问题
针对你遇到的No rule to make target 'hello.o'错误,按以下步骤排查修复:
1. 修复内核模块源码的语法错误
你的hello.c中printk的字符串存在语法问题——换行直接嵌入引号内会导致编译失败,修改为标准的转义换行格式:
#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);
2. 确保镜像包含完整的编译工具链
kernel-devsrc仅提供内核源码与配置,编译模块还需要gcc、make等工具。修改Yocto的local.conf添加工具包:
IMAGE_INSTALL_append += " gcc make binutils"
重新生成镜像并烧录到开发板。
3. 准备内核模块编译环境
进入内核build目录,执行模块编译准备命令,确保生成必要的依赖文件:
cd /lib/modules/$(uname -r)/build make modules_prepare
4. 验证Makefile的正确性
- 确保Makefile中的缩进是Tab键而非空格(make对缩进格式有严格要求)
- 可显式指定ARCH参数,避免编译环境识别问题,修改后的Makefile:
obj-m += hello.o KERNEL_SRC = /lib/modules/$(shell uname -r)/build ARCH ?= x86_64 all: make -C $(KERNEL_SRC) ARCH=$(ARCH) M=$(PWD) modules clean: make -C $(KERNEL_SRC) ARCH=$(ARCH) M=$(PWD) clean
完成以上步骤后,回到模块源码目录执行make即可正常编译内核模块。
内容的提问来源于stack exchange,提问作者fly fish
相关产品推荐
相关产品推荐

