..\OBJ\Template.axf: Error: L6200E: Symbol __ARM_use_no_argv multiply defined (by test.o and main.o).
时间: 2023-10-22 12:42:32 浏览: 80
这个错误是由于代码中定义的某些符号在多个目标文件中重复定义导致的。在您的情况下,__ARM_use_no_argv 符号被 test.o 和 main.o 两个目标文件定义了多次,因此链接器无法决定使用哪个定义。
要解决这个问题,您需要查找并删除重复定义的符号。您可以通过在链接器命令行中添加 `-Wl,--print-map` 选项来生成一个符号映射文件,该文件列出了所有符号及其定义的目标文件。使用此文件可以方便地检查哪个文件中定义了重复的符号。另外,您还可以尝试使用 `extern` 关键字来声明符号,以便在多个文件中共享它。
最后,确保您的代码没有重复定义符号和函数,以避免此类错误的发生。
相关问题
..\OBJ\OLED.axf: Error: L6200E: Symbol __ARM_use_no_argv multiply defined (by main.o and 6.o).
这个错误表明在连接阶段,链接器(LD)发现了多个定义了同一个符号(symbol)的目标文件(.o文件)。在你的情况下,符号 "__ARM_use_no_argv" 被 main.o 和 6.o 这两个目标文件重复定义了。
这种错误通常发生在多个文件中都定义了相同的全局变量或函数。为了解决这个问题,你可以尝试以下几种方法:
1. 检查你的代码和项目结构,确保只有一个地方定义了 "__ARM_use_no_argv" 符号。如果有多个地方定义了它,需要去除或合并这些定义。
2. 检查编译选项和链接选项,确保没有重复包含相同的源文件或目标文件。
3. 如果 "__ARM_use_no_argv" 是一个全局变量,可以将其声明为 `extern`,并在某个源文件中定义它。然后在其他需要使用它的地方,只需声明它即可。
4. 如果 "__ARM_use_no_argv" 是一个局部变量,可以考虑将其作为函数的参数传递,而不是作为全局变量。
5. 如果以上方法都无效,可能需要检查你使用的库或第三方代码,看是否存在冲突或重复定义的情况。
请根据具体情况逐个尝试这些解决方法,并确保只有一个地方定义了 "__ARM_use_no_argv" 符号,这样链接器就不会报错了。
..\OBJ\template.axf: Error: L6200E: Symbol USART1_IRQHandler multiply defined (by modbus.o and usart.o).
这个错误是由于在你的项目中,存在多个源文件(modbus.c 和 usart.c)都定义了同一个中断处理函数 USART1_IRQHandler 导致的。链接器会报出 L6200E 错误,提示该符号(中断处理函数)被多次定义。
解决这个问题的方法是确保每个中断处理函数只在一个源文件中进行定义。你可以考虑将 USART1_IRQHandler 函数定义放在一个单独的源文件中,并在其他源文件中通过 extern 声明来引用它。这样就能避免重复定义的问题。
例如,你可以创建一个名为 interrupts.c 的新源文件,将 USART1_IRQHandler 函数的定义放在其中:
```c
// interrupts.c 文件
#include "interrupts.h"
void USART1_IRQHandler(void)
{
// 中断处理代码
}
```
然后,在 modbus.c 和 usart.c 中使用 extern 声明来引用该函数:
```c
// modbus.c 文件
#include "interrupts.h"
extern void USART1_IRQHandler(void);
// modbus.c 中的其他代码
```
```c
// usart.c 文件
#include "interrupts.h"
extern void USART1_IRQHandler(void);
// usart.c 中的其他代码
```
这样做就可以避免符号重复定义的错误,并且每个源文件都能正确引用到中断处理函数。请记得在编译时将 interrupts.c 一起包含进来。