c - 内核模块中已定义但未使用的变量消息
问题描述
在我的内核模块中,我有两个非常短的 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;
并忽略编译器给出的“已定义但未使用”警告?我不认为仅仅“忽略”警告是一个好习惯,尤其是在涉及内核模块时。
提前致谢。
解决方案
您的问题不是很清楚,因为缺少完整的上下文;但无论如何,我认为可以给出一些建议。
首先,您的资源将与其他文件一起使用;这些文件定义了您必须注意的事情,否则就会multiple definition of 'gpio'
出现。在这种情况下(gpio),您必须决定是否要与“其他”gpio 变量交互——如果不是,您必须使用另一个名称(这不是强制性的,但更好)。
其次,您必须了解 C 编译器的工作原理,尤其是与内核交互时,它会增加一些机制。通常,您不想在头 (.h) 文件中定义变量;相反,您确实声明了它们以及数据类型、宏和函数原型。在源文件 (.c) 中,您可以使用 #include 标头来使用其中的声明。
变量在 .c 文件中定义,如果需要,可以通过头文件提供给其他模块。否则,将它们设为静态并且不要在标题中提及它们。
声明和定义之间的区别是:声明告诉编译器“你会在某个地方遇到(也许)这个名字,它具有以下属性”;一个定义的意思是“我用这些属性创建了这个名字,这个东西就在这里。”。
当多个软件一起使用时,通常会发生一个软件执行另一个软件所需的事情......声明是让这些软件一起工作的方式。
希望这有所帮助。
推荐阅读
- r - 有没有办法在永久删除后在 RStudio 上重新安装一个包?
- node-webkit - Node Webkit 从 Node 更改 DOM 元素
- perl - chomp 似乎清理了整个字符串或阻止它被打印
- javascript - 使用按位运算符删除小数部分如何工作?
- angular-test - 无法绑定到“ngModel”,因为它不是“quill-editor”的已知属性
- sql - 我需要显示财务部门的最低工资和最高工资之间的减法(其中department_id = 100)
- python - 调用前一个函数中定义的变量时显示错误值 (None)
- php - Symfony,WebTestCase 案例,由于测试中未使用的服务而崩溃
- node.js - Nodejs + Firebase 身份验证
- c - C中的函数和while循环问题:找不到我无法退出循环的原因