多个定义 - GCC伪造错误

时间:2015-03-21 22:59:56

标签: c gcc avr avr-gcc

我有一个头文件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));
}

我在lcd.h中包含main.c,并使用makefile单独编译lcd.c

我收到此错误:&#34;`LCD_ROW_ADDR的多重定义&#39;&#34;

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

我已多次检查文件,并且没有其他变量定义。 &#34;首先在这里定义&#34;是一个谎言,main.c中的一行包含无限循环代码,与此无关。

这里发生了什么?

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

1 个答案:

答案 0 :(得分:5)

ld是对的。由于标题,您在两个单独的编译单元中定义了相同的变量。

解决此问题的方法是在标头中声明extern,并且只有一个单元重新声明它,而在其.c文件中没有extern限定符