【问题标题】:Multiply defined symbols in Keil (ERROR L76200E)Keil 中定义的符号相乘(错误 L76200E)
【发布时间】:2021-09-28 01:47:29
【问题描述】:

我正在尝试拆分我的代码,但由于函数calculateNmeaChecksum()... 这是我的两个文件:

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 != '\0'))
    result ^= *s++;
    return result;
} 

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

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

【问题讨论】:

  • 你能把你的问题添加到结尾吗?
  • 校验和应该是一个无符号字符,而不仅仅是一个字符
  • 对不起,我刚刚编辑了
  • @AdrienG。我试着改成无符号字符,还是不行……
  • 尝试删除函数参数中的 const

标签: c keil


【解决方案1】:

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

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

unsigned char calculateNmeaChecksum(const char *s);

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

【讨论】:

    猜你喜欢
    • 2020-04-02
    • 2017-07-27
    • 1970-01-01
    • 1970-01-01
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    相关资源
    最近更新 更多