多个定义 - GCC 虚假错误

Multiple definitions of - GCC bogus error

我有一个头文件 lcd.h 这个(缩短):

#pragma once
// ...
const uint8_t LCD_ROW_ADDR[] = {0x00, 0x40, 0x14, 0x54};
// ... other prototypes and macros...

还有一个文件lcd.c,其中使用了这个变量:

#include <stdbool.h>
#include <stdint.h>
// ...

#include "lcd.h"

// ...

/** Set cursor position */
void lcd_xy(const uint8_t x, const uint8_t y)
{
    lcd_set_addr(LCD_ROW_ADDR[y] + (x));
}

我在main.c里包含了lcd.hlcd.c是用makefile单独编译的

我收到此错误:"multiple definition of `LCD_ROW_ADDR'"

avr-gcc -std=gnu99 -mmcu=atmega328p -DF_CPU=16000000UL -I. -Ilib/ -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wno-main -Wno-strict-prototypes -Wno-comment -g2 -Wextra -Wfatal-errors -ffunction-sections -fdata-sections -Wl,--gc-sections -Wl,--relax -DDEBO_CHANNELS=6 -DDEBO_TICKS=1 -Os main.c lib/debounce.c lib/lcd.c lib/adc.c  --output main.elf
/tmp/ccgfa1iK.o: In function `lcd_xy':
/home/ondra/git/avr-projects/devel/lcdsnake/lib/lcd.c:203: multiple definition of `LCD_ROW_ADDR'
/tmp/cc0iT39O.o:/home/ondra/git/avr-projects/devel/lcdsnake/main.c:424: first defined here
/usr/bin/avr-ld: Disabling relaxation: it will not work with multiple definitions
collect2: error: ld returned 1 exit status
Makefile:87: recipe for target 'main.elf' failed
make: *** [main.elf] Error 1

我已经多次检查文件,没有其他变量的定义。 "first defined here"是个谎言,main.c中的那一行包含一个死循环代码,与此无关。

这是怎么回事?

(ps。如果我将变量移动到 lcd.c 文件中,它编译正常 - 但我想将它放在头文件中,因此也可以从其他地方访问它)

ld 是正确的。由于 header.

,您在两个单独的编译单元中定义了相同的变量

解决这个问题的方法是在 header 中声明它 extern,并且只有 一个 的单位在没有 [=] 的情况下重新声明它10=] .c 文件中的限定符。