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

md.*_*mal 1 c gcc linux-device-driver linux-kernel

我将 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
Run Code Online (Sandbox Code Playgroud)

当我将两个驱动程序添加为内置驱动程序并在两个驱动程序代码中包含头文件(#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
Run Code Online (Sandbox Code Playgroud)

我该如何解决这个错误。谢谢你的时间..

nos*_*nos 5

有3个常用选项。

  1. 不要在头文件中定义固件,而是在 .c 文件中定义它并在该 .c 文件中创建
    使用该固件所需的函数。在头文件中公开这些函数。

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

像这样:

static const unsigned char ucPICAppsectorFirmware[] = ....
Run Code Online (Sandbox Code Playgroud)

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

  1. 将数组放在一个 .c 文件中,并声明它而不是在头文件中定义它。这样就不会为包含它的每个文件复制数组,就像在头文件中定义数组时的情况一样。

即头文件看起来像。

extern const unsigned char ucPICAppsectorFirmware[];
extern const size_t ucPICAppsectorFirmwareLen;
Run Code Online (Sandbox Code Playgroud)

.c 文件看起来像

const unsigned char ucPICAppsectorFirmware[] = ...;
const size_t ucPICAppsectorFirmwareLen = sizeof ucPICAppsectorFirmware;
Run Code Online (Sandbox Code Playgroud)