c - "multiple definition of first defined here"。 STM32、AC6工作室

标签 c arm stm32 hardware

我面临一个愚蠢的问题,尽管一切都必须正常工作。我的任务是 - 使用 union 和结构的数据类型初始化 I/O 寄存器。我只使用我的名字进行初始化,这样我就可以避免重新定义系统变量引起的错误。但是,编译器仍然向我显示我创建的所有变量的错误,因为它们已在项目的其他地方初始化。有我的变量初始化代码:

volatile SYSCFG_t* mysyscfg=(volatile SYSCFG_t*)MYSYSCFG;

volatile RCC_AHB2ENR_t* myrcc_ahb2enr=(volatile RCC_AHB2ENR_t*)(MYRCC|MYAHB2ENR_OFFS);

volatile RCC_APB2ENR_t* myrcc_apb2enr=(volatile RCC_APB2ENR_t*)(MYRCC|MYAPB2ENR_OFFS);

volatile GPIO_t* mygpiob=(volatile GPIO_t*)MYGPIOB;

volatile GPIO_t* mygpioe=(volatile GPIO_t*)MYGPIOE;

volatile GPIO_t* mygpioa=(volatile GPIO_t*)MYGPIOA;

我犯的错误如下:

src/main.o:/home/bogdan/workspace/timers/Debug/../src/lib.h:262: multiple definition of `mysyscfg'
src/init.o:/home/bogdan/workspace/timers/Debug/../src/lib.h:262: first defined here
src/main.o:/home/bogdan/workspace/timers/Debug/../src/lib.h:263: multiple definition of `myrcc_ahb2enr'
src/init.o:/home/bogdan/workspace/timers/Debug/../src/lib.h:263: first defined here
src/main.o:/home/bogdan/workspace/timers/Debug/../src/lib.h:264: multiple definition of `myrcc_apb2enr'
src/init.o:/home/bogdan/workspace/timers/Debug/../src/lib.h:264: first defined here
src/main.o:/home/bogdan/workspace/timers/Debug/../src/lib.h:265: multiple definition of `mygpiob'
src/init.o:/home/bogdan/workspace/timers/Debug/../src/lib.h:265: first defined here
src/main.o:/home/bogdan/workspace/timers/Debug/../src/lib.h:266: multiple definition of `mygpioe'
src/init.o:/home/bogdan/workspace/timers/Debug/../src/lib.h:266: first defined here
src/main.o:/home/bogdan/workspace/timers/Debug/../src/lib.h:267: multiple definition of `mygpioa'
src/init.o:/home/bogdan/workspace/timers/Debug/../src/lib.h:267: first defined here
collect2: error: ld returned 1 exit status
make: *** [makefile:62: timers.elf] Error 1

最佳答案

这些是链接器错误。你可能正在做这样的事情:

main.c:

#include "lib.h"

init.c:

#include "lib.h"

当链接器检查 main.c 和 init.c 中的符号和类型时,它发现它们中的每一个都定义了完全相同的符号,因此出现了错误。通常头文件只声明符号,而不是定义它们,但是有一些创造性的使用条件代码可以解决这个问题:

lib.h(请为这个文件想一个更具描述性的名称)

#if defined IN_INIT_C
  volatile SYSCFG_t* mysyscfg=(volatile SYSCFG_t*)MYSYSCFG; // Definition
#else
  extern volatile SYSCFG_T* mysyscfg; // Declaration
#endif

现在在 init.c 中,并且只在那个文件中:

#define IN_INIT_C
#include "lib.h"

或者您可以简单地将定义放在 init.c 中并通过仅在其中放置声明来简化您的标题。

您还应该阅读此搜索提供的问答:

https://stackoverflow.com/search?q=%5Bc%5Ddifference+between+declaration+and+definition

关于c - "multiple definition of first defined here"。 STM32、AC6工作室,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64090730/

相关文章:

arm - ARM (Cortex M3) 的应用程序内编程如何工作?

c - STM32 SPI 发送

c - 使用 pthreads/cond_signal/cond_wait 时如何考虑循环缓冲区大小 1?

assembly - ARM assembly 中的分支

arm - 如何使用适用于 ARM 的 IAR 编译器编译 Google Test

使用 NEON 指令的 Linpack 的 clang O3/O2 错误

c - f3发现: trying to use an lcd screen 1602 with an I2C module

c - char数组指向c中整数的指针

c - Objective C 版本的 explode()?

c++ - FFmpeg 1.0 < 导致音频播放问题