首页 > 解决方案 > 内核模块中已定义但未使用的变量消息

问题描述

在我的内核模块中,我有两个非常短的 C 源文件(主文件和一个 daq.c 和 daq.h 文件)。头文件包含许多变量和函数。当我正常编译函数时,通过在 daq.h 文件中声明变量:

volatile uint32_t *gpio;

我收到以下错误:

error In function `.LANCHOR1': daq.c:(.bss+0x50): multiple definition of `gpio'

这个错误只能通过将变量声明为静态来解决,如下:

static volatile uint32_t *gpio;

内核模块工作正常,但在这种情况下,我收到以下警告,因为静态声明会在包含它的每个文件上创建一个单独的副本:

warning: ‘gpio’ defined but not used [-Wunused-variable]: static volatile uint32_t *gpio;

我试图将它声明为 extern 或者只是简单地将变量声明为uint32_t *gpio而不是声明它是静态的,但后来我得到了:

WARNING: "gpio" undefined!

插入模块(并且未加载模块)时,dmesg 日志中会出现“树外定义”消息。

那么,在这种情况下,为了声明变量,最好的方法是什么?将其声明为是否正确:

static volatile uint32_t *gpio;

并忽略编译器给出的“已定义但未使用”警告?我不认为仅仅“忽略”警告是一个好习惯,尤其是在涉及内核模块时。

提前致谢。

标签: craspbiancompiler-warningskernel-modulevariable-declaration

解决方案


您的问题不是很清楚,因为缺少完整的上下文;但无论如何,我认为可以给出一些建议。

首先,您的资源将与其他文件一起使用;这些文件定义了您必须注意的事情,否则就会multiple definition of 'gpio'出现。在这种情况下(gpio),您必须决定是否要与“其他”gpio 变量交互——如果不是,您必须使用另一个名称(这不是强制性的,但更好)。

其次,您必须了解 C 编译器的工作原理,尤其是与内核交互时,它会增加一些机制。通常,您不想在头 (.h) 文件中定义变量;相反,您确实声明了它们以及数据类型、宏和函数原型。在源文件 (.c) 中,您可以使用 #include 标头来使用其中的声明。

变量在 .c 文件中定义,如果需要,可以通过头文件提供给其他模块。否则,将它们设为静态并且不要在标题中提及它们。

声明和定义之间的区别是:声明告诉编译器“你会在某个地方遇到(也许)这个名字,它具有以下属性”;一个定义的意思是“我用这些属性创建了这个名字,这个东西就在这里。”。

当多个软件一起使用时,通常会发生一个软件执行另一个软件所需的事情......声明是让这些软件一起工作的方式。

希望这有所帮助。


推荐阅读