在 Keil 中多次定义符号 (ERROR L76200E)

Multiply defined symbols in Keil (ERROR L76200E)

我正在尝试拆分我的代码,但由于函数 calculateNmeaChecksum()...,我在 Keil 中面临多重定义的符号 这是我的两个文件:

Main.c :

#include "main.h"
#include "UART_functions.c"
char checksum;

int main(void)
{
  HAL_Init();
  SystemClock_Config();

  MX_GPIO_Init();
  MX_SDMMC1_SD_Init();
  MX_TIM5_Init();
  MX_TIM16_Init();
  MX_FATFS_Init();
  MX_SPI1_Init();
  MX_SPI2_Init();
  MX_USART1_UART_Init();

  HAL_TIM_Base_Start_IT(&htim16);
  
  checksum = calculateNmeaChecksum("$PMTKLOG,456,0,11,31,2,0,0,0,3769,46*48");

  while (1)
  {
  
  }
}

UART_functions.c

unsigned char calculateNmeaChecksum(const char *s)
{
unsigned char result;
    result = 0;
    s++;            // Skip dollar sign
    while ((*s != '*') && (*s != '[=11=]'))
    result ^= *s++;
    return result;
} 

我尝试编译时出现此错误:

UART_GPS\UART_GPS.axf: Error: L6200E: Symbol calculateNmeaChecksum multiply defined (by uart_functions.o and main.o).

您正在编译该函数两次,第一次编译到“uart_functions.o”,第二次编译到“main.o”。然后你 link 两个模块。

在“main.c”中,您应该只包含声明函数原型的头文件“uart_functions.h”:

unsigned char calculateNmeaChecksum(const char *s);

顺便说一句,错误信息 crystal 很清楚... ;-)