linux 设备驱动程序中的多重定义错误
multiple definition error in linux device driver
我将 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
我该如何解决这个错误。谢谢你的时间..
因为ucPICAppsectorFirmware
是一个定义而不仅仅是一个声明,
您必须在头文件中将 ucPICAppsectorFirmware
声明为 extern,否则该定义将存在于包含 pic_firmware.h
的每个文件中。
这就是导致多重定义链接器错误的原因。
共有 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;
我将 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
我该如何解决这个错误。谢谢你的时间..
因为ucPICAppsectorFirmware
是一个定义而不仅仅是一个声明,
您必须在头文件中将 ucPICAppsectorFirmware
声明为 extern,否则该定义将存在于包含 pic_firmware.h
的每个文件中。
这就是导致多重定义链接器错误的原因。
共有 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;