c - Linux设备驱动程序中的多重定义错误

标签 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

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

最佳答案

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

关于c - Linux设备驱动程序中的多重定义错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52641151/

相关文章:

c++ - 奇怪的 GCC 数组初始化行为

linux - GCC - 不要编译未使用的代码

linux-kernel - 安装 vmware 工具 : not recognizing path to 3. 8.0-19-generic 内核文件

C 可变参数函数 : How to specify which type to give to va_arg

c++ - 添加断点并运行程序时无法访问地址处的内存

linux - 在 Linux 上使用 C++14 并发布针对不同 Linux 版本的二进制文件

linux - 陷阱值有什么用?

c - 最大函数 c 树高

c - Openmp 减少循环错误?

c++ - 首先定义 Here c++ error by adding one file