【问题标题】:multiple definition error in linux device driver [duplicate]linux设备驱动程序中的多个定义错误[重复]
【发布时间】:2019-03-09 12:24:38
【问题描述】:

我的 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

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

【问题讨论】:

    标签: c gcc linux-kernel linux-device-driver


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

      因为ucPICAppsectorFirmware 是一个定义而不仅仅是一个声明, 您必须在头文件中将ucPICAppsectorFirmware 声明为extern,否则该定义将存在于包含pic_firmware.h 的每个文件中。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多