内核模块中的变量已定义但未使用消息

Variable defined but not used message in kernel module

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

volatile uint32_t *gpio;

我收到以下错误:

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

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

static volatile uint32_t *gpio;

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

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

我试图将其声明为 extern 或只是将变量声明为 uint32_t *gpio 而不是将其声明为 static 但随后我得到一个:

WARNING: "gpio" undefined!

插入模块(但未加载模块)时,dmesg 日志中会出现 "out-of-tree definition" 消息。

那么,在这种情况下,如何进行声明变量的最佳方式是什么?声明为:

是否正确

static volatile uint32_t *gpio;

并忽略编译器给出的 "defined but not used" 警告?我不认为 "omitting" 警告是一个好习惯,尤其是涉及到内核模块时。

提前致谢。

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

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

其次,您必须了解 C 编译器的工作原理,特别是如果您与内核交互,内核会添加一些机制。通常,您不想在 header (.h) 文件中 定义 变量;相反,您 声明 它们,连同数据类型、宏和函数原型。在源文件 (.c) 中,您 #include headers 以便使用其中的声明。

变量在 .c 文件中 定义,如果需要,可通过 header 文件供其他模块使用。否则,将它们设为静态并且不要在 header.

中提及它们

声明和定义的区别在于:声明告诉编译器"you will encounter (perhaps) this name, somewhere, which has the following properties";一个定义而不是意味着 "I create this name, with these properties, and this thing is exactly here."。

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

希望对您有所帮助。