首页 > 解决方案 > 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

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

标签: cgcclinux-kernellinux-device-driver

解决方案


有 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;

推荐阅读