c - linux设备驱动程序中的多重定义错误
问题描述
我的 PIC 固件(阵列)存储在头文件(pic_firmware.h)中。
这个阵列被两个 USB Linux 驱动程序用于我的定制板。
#ifndef PIC_FIRMWARE_H
#define PIC_FIRMWARE_H
const unsigned char ucPICAppsectorFirmware[] =
{
0xa5,0xef,0x2b,0xf0, 0x12,0x00,0x12,0x00, // Address 0x3000
0x81,0xef,0x29,0xf0, 0x12,0x00,0x12,0x00, // Address 0x3008
0x00,0x00,0xff,0xff, 0xff,0xff,0xff,0xff, // Address 0x3010
0xab,0xef,0x29,0xf0, 0x12,0x00,0xff,0xff, // Address 0x3018
....
}
#endif
当我将两个驱动程序添加为内置并在两个驱动程序代码中包含头文件(#include“pic_firmware.h”)时,我收到多个定义错误
| drivers/usb/misc/pic_dfu.o:(.rodata+0x80): multiple definition of `ucPICAppsectorFirmware'
| drivers/usb/misc/usb_mib.o:(.rodata+0xcc0): first defined here
我该如何解决这个错误。谢谢你的时间..
解决方案
有 3 个常用选项。
不要在头文件中定义固件,在 .c 文件中定义它,并在该 .c 文件中创建
使用该固件所需的功能。在头文件中公开这些函数。将数组设为静态,使其在其他翻译单元中不可见:
像这样:
static const unsigned char ucPICAppsectorFirmware[] = ....
请注意,这将在包含此头文件的每个 .c 文件中创建数组的副本。
- 将数组放在 .c 文件中,并声明它而不是在头文件中定义它。这样,数组就不会被包含它的每个文件复制,就像在头文件中定义数组时一样。
即头文件看起来像。
extern const unsigned char ucPICAppsectorFirmware[];
extern const size_t ucPICAppsectorFirmwareLen;
.c 文件看起来像
const unsigned char ucPICAppsectorFirmware[] = ...;
const size_t ucPICAppsectorFirmwareLen = sizeof ucPICAppsectorFirmware;
推荐阅读
- excel - Excel INDEX 和 MATCH 公式 - 查找列字母
- python - 使用 Sphinx 的内部类中未显示来自父类的属性文档字符串
- node.js - 如何结束间谍的函数执行?
- javascript - 如何在 extraParams 商店 extjs 上设置动态值
- mysql - Django忽略远程MYSQL连接细节
- html - CSS:防止单个字符换行
- weblogic - jython 创建工作管理器,但我得到新属性未找到错误我该如何解决这个问题
- entity-framework - EF 6.4 SqlException:无法将值 NULL 插入列 'ID'、表 PERMISSION';列不允许 NULLS
- amazon-web-services - 无法通过 SSH 连接到 AWS Ubuntu 18.04 服务器
- java - 无法通过浏览器上的 localport 访问 Spring Boot Web