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

编译Linux Hello World内核模块提示missing MODULE_LICENSE()报错

外部内核模块编译问题解答

编译时切到内核源码目录的原因

你Makefile中使用的构建命令make -C /lib/modules/$(KVERSION)/build M=$(PWD) modules里,-C参数的作用是指定make执行构建规则的工作目录。/lib/modules/5.14.0/build不是普通目录,是你执行make modules_install时自动生成的软链接,默认指向你编译对应版本内核时使用的源码路径,也就是你看到的/home/parallels/linux-5.14。
外部模块编译必须依赖匹配版本内核的构建脚本、头文件、内核编译配置,这个跳转是内核模块编译的标准流程,属于正常现象,不是配置错误。

missing MODULE_LICENSE() 报错修复

这个报错和模块复杂度无关,是Linux 2.6版本之后内核强制要求的声明规则,哪怕是最简的Hello World模块也必须添加,不需要修改源码文件名或者编译目标名,直接在hello.c中补充许可证宏声明即可。
修改后的完整hello.c代码如下:

#include <linux/module.h>   /* 所有内核模块必须引入 */
#include <linux/kernel.h>   /*  printk、KERN_INFO 相关定义 */

/* 补充许可证声明,使用GPL许可证和内核本身许可证兼容,不会触发许可冲突 */
MODULE_LICENSE("GPL");

int init_module(void)
{
    printk(KERN_INFO "Hello world 1.\n");

    /*
     * 返回非0值代表模块初始化失败,无法被加载
     */
    return 0;
}

void cleanup_module(void)
{
    printk(KERN_INFO "Goodbye world 1.\n");
}

修改完源码后,先执行make clean清理之前编译产生的残缺中间文件,再执行make即可正常编译生成hello.ko内核模块文件。

补充说明:修改文件名后触发的no rule to make target错误,是因为修改文件名后,Makefile中obj-m = hello.o配置和实际存在的源文件名不匹配导致的,和许可证报错本身没有关联。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 11:27:22