如何在 Keil V5 中修复 'Multiply defined'
How to fix 'Multiply defined' in Keil V5
我正在尝试编译我的代码,但我得到了错误 "multiply defined",尽管我只在一个 header 中定义了我的变量(例如“.\Objects\LCDADC.axf:错误:L6200E : 符号 Pin_D6 多重定义(由 lcd.o 和 main.o).".)
我在 LPC1768 上使用 Keil
main.c
#include <lpc17xx.h>
#include "LCD.h"
#include "Delay.h"
//Char LCD Pins
#define LCD_RS P2_0
#define LCD_RW P2_1
#define LCD_E P2_2
#define LCD_D4 P2_4
#define LCD_D5 P2_5
#define LCD_D6 P2_6
#define LCD_D7 P2_7
int main(){
SystemInit();
Delay_init();
LCD_Init(LCD_RS, LCD_RW, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7);
int main....
LCD.H
#include "Delay.h"
uint8_t Pin_RS;
uint8_t Pin_RW;
uint8_t Pin_E;
uint8_t Pin_D4;
uint8_t Pin_D5;
uint8_t Pin_D6;
uint8_t Pin_D7;
void LCD_Init(uint8_t rs, uint8_t rw, uint8_t e, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7);
....(More functions)
LCD.c
#include "LCD.h"
#include "GPIO.h"
#include "Delay.h"
void LCD_Init(uint8_t rs, uint8_t rw, uint8_t e, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7)
{
//Set Pin Numbers
Pin_RW = rw;
Pin_E = e;
Pin_RS = rs;
Pin_D4 = d4;
Pin_D5 = d5;
Pin_D6 = d6;
Pin_D7 = d7;
//Set port Directions
GPIO_PinDirection(Pin_D4, 1);
....(same for every pin and some command sending.)
}
....(Other Functions.)
(很抱歉发布了我的整个代码,但我认为在这种情况下它很重要而且很短。)
如您所见,我显然只定义了一次引脚。那为什么它认为我在多次定义它呢?
您已在头文件 LCD.h
中声明了这些变量。无论何时包含头文件,都会声明这些变量。
您已将该文件包含在 main.c
和 LCD.c
中,这意味着为每个变量创建了两个实例。由于这些变量是全局变量,因此您不能两次使用相同的名称。这就是您收到错误的原因。
要解决这个问题,请移动 LCD.c
中的那些变量。如果您不打算在此 C 文件之外使用它们,请将它们设为静态。这样一来,它们就仅限于 LCD.c
。
另一个提示(与错误无关)是您应该使用 Include Guards。您的 Delay.h
被多次收录。
我正在尝试编译我的代码,但我得到了错误 "multiply defined",尽管我只在一个 header 中定义了我的变量(例如“.\Objects\LCDADC.axf:错误:L6200E : 符号 Pin_D6 多重定义(由 lcd.o 和 main.o).".)
我在 LPC1768 上使用 Keil
main.c
#include <lpc17xx.h>
#include "LCD.h"
#include "Delay.h"
//Char LCD Pins
#define LCD_RS P2_0
#define LCD_RW P2_1
#define LCD_E P2_2
#define LCD_D4 P2_4
#define LCD_D5 P2_5
#define LCD_D6 P2_6
#define LCD_D7 P2_7
int main(){
SystemInit();
Delay_init();
LCD_Init(LCD_RS, LCD_RW, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7);
int main....
LCD.H
#include "Delay.h"
uint8_t Pin_RS;
uint8_t Pin_RW;
uint8_t Pin_E;
uint8_t Pin_D4;
uint8_t Pin_D5;
uint8_t Pin_D6;
uint8_t Pin_D7;
void LCD_Init(uint8_t rs, uint8_t rw, uint8_t e, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7);
....(More functions)
LCD.c
#include "LCD.h"
#include "GPIO.h"
#include "Delay.h"
void LCD_Init(uint8_t rs, uint8_t rw, uint8_t e, uint8_t d4, uint8_t d5, uint8_t d6, uint8_t d7)
{
//Set Pin Numbers
Pin_RW = rw;
Pin_E = e;
Pin_RS = rs;
Pin_D4 = d4;
Pin_D5 = d5;
Pin_D6 = d6;
Pin_D7 = d7;
//Set port Directions
GPIO_PinDirection(Pin_D4, 1);
....(same for every pin and some command sending.)
}
....(Other Functions.)
(很抱歉发布了我的整个代码,但我认为在这种情况下它很重要而且很短。)
如您所见,我显然只定义了一次引脚。那为什么它认为我在多次定义它呢?
您已在头文件 LCD.h
中声明了这些变量。无论何时包含头文件,都会声明这些变量。
您已将该文件包含在 main.c
和 LCD.c
中,这意味着为每个变量创建了两个实例。由于这些变量是全局变量,因此您不能两次使用相同的名称。这就是您收到错误的原因。
要解决这个问题,请移动 LCD.c
中的那些变量。如果您不打算在此 C 文件之外使用它们,请将它们设为静态。这样一来,它们就仅限于 LCD.c
。
另一个提示(与错误无关)是您应该使用 Include Guards。您的 Delay.h
被多次收录。