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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:03:07