linux设备驱动程序中的多定义错误

时间:2018-10-04 07:21:22

标签: c gcc linux-kernel 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

如何解决此错误。谢谢您的时间。.

2 个答案:

答案 0 :(得分:4)

共有3个常用选项。

  1. 不要在头文件中定义固件,而在.c文件中定义固件并创建
    您需要在该.c文件中使用该固件的功能。在头文件中公开这些功能。

  2. 将数组设为静态,因此在其他翻译单元中不可见:

像这样:

static const unsigned char ucPICAppsectorFirmware[] = ....

请注意,这将在每个包含该头文件的.c文件中创建数组的副本。

  1. 将数组放在.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的文件中。

这是导致多定义链接器错误的原因。