如何在 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.cLCD.c 中,这意味着为每个变量创建了两个实例。由于这些变量是全局变量,因此您不能两次使用相同的名称。这就是您收到错误的原因。

要解决这个问题,请移动 LCD.c 中的那些变量。如果您不打算在此 C 文件之外使用它们,请将它们设为静态。这样一来,它们就仅限于 LCD.c

另一个提示(与错误无关)是您应该使用 Include Guards。您的 Delay.h 被多次收录。