Embedded 如何修复';乘法定义';在Keil V5中

Embedded 如何修复';乘法定义';在Keil V5中,embedded,keil,cortex-m,lpc,Embedded,Keil,Cortex M,Lpc,我试图编译我的代码,但尽管只在一个标题中定义了变量,但还是出现了错误“定义了乘法”(例如“\Objects\LCDADC.axf:error:L6200E:Symbol Pin_D6乘法定义(通过lcd.o和main.o)。” 我使用Keil和LPC1768 main.c #include <lpc17xx.h> #include "LCD.h" #include "Delay.h" //Char LCD Pins #define LCD_RS P2_0 #define LCD_

我试图编译我的代码,但尽管只在一个标题中定义了变量,但还是出现了错误“定义了乘法”(例如“\Objects\LCDADC.axf:error:L6200E:Symbol Pin_D6乘法定义(通过lcd.o和main.o)。”

我使用Keil和LPC1768

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....

液晶显示器

(很抱歉发布了我的全部代码,但我认为在这种情况下它很重要,而且非常简短。)


正如你所看到的,我只清楚地定义了一次PIN。那么为什么它认为我多次定义了它呢?

您已经在头文件
LCD.h
中声明了这些变量。无论何时包含头文件,都将声明这些变量

您已将该文件包括在
main.c
LCD.c
中,这意味着将创建每个变量的两个实例。由于这些变量是全局变量,因此不能有两个相同的名称。这就是为什么会出现错误

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


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

非常感谢您的回答:)但是如果我使用了防护装置,会解决问题吗?当使用防护装置时,它并没有解决我的问题。当我的电脑在C++中编程时,我总是在变量的边上声明我的变量。所以我不知道为什么它不在这里工作(编辑:我是个白痴,我忘了这不是一个班……,我已经编码了2年,我只是重新开始)一个技术性的,但是在“声明”和“定义”之间有区别。这个问题与多个定义有关。线路
uint8\u t引脚声明并定义变量
Pin\RS
。通常不应该在头文件中定义变量,因为该定义将在包含头文件的每个C文件中重复。在头文件中声明全局变量是正常的。添加
extern
以生成仅声明的语句(无定义),如
extern uint8\t Pin\RS。然后在一个C文件中添加一条定义语句。@swand,外部库呢?有时已从外部库生成(例如stm32f1x_it.c)
#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)
#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.)