我有一个头文件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
文件中,它编译正常 - 但我想将它放在头文件中,因此也可以从其他地方访问它)
答案 0 :(得分:5)
ld是对的。由于标题,您在两个单独的编译单元中定义了相同的变量。
解决此问题的方法是在标头中声明extern
,并且只有一个单元重新声明它,而在其.c文件中没有extern
限定符