我将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
如何解决此错误。谢谢您的时间。.
答案 0 :(得分:4)
共有3个常用选项。
不要在头文件中定义固件,而在.c文件中定义固件并创建
您需要在该.c文件中使用该固件的功能。在头文件中公开这些功能。
将数组设为静态,因此在其他翻译单元中不可见:
像这样:
static const unsigned char ucPICAppsectorFirmware[] = ....
请注意,这将在每个包含该头文件的.c文件中创建数组的副本。
即头文件的样子。
extern const unsigned char ucPICAppsectorFirmware[];
extern const size_t ucPICAppsectorFirmwareLen;
.c文件看起来像
const unsigned char ucPICAppsectorFirmware[] = ...;
const size_t ucPICAppsectorFirmwareLen = sizeof ucPICAppsectorFirmware;
答案 1 :(得分:1)
由于ucPICAppsectorFirmware
是一个定义,而不仅仅是一个声明,
您必须在头文件中将ucPICAppsectorFirmware
声明为extern,否则定义将存在于每个包含pic_firmware.h
的文件中。
这是导致多定义链接器错误的原因。