Keil编译错误:Error: L6200E: Symbol ****** multiply defined (by *** and ***)

本文记录了在移植OV5640摄像头模块驱动过程中遇到的multiply-defined错误,并分享了解决该问题的经验。错误源于头文件被重复包含,通过调整头文件的包含位置解决了问题。

在移植正点原子OV5640的驱动程序时,遇到了multiply defined错误。错误报表如下:

         出现这么多错误,满脑子的问号❓首先检查了下这几个出现错误的命名,没有出现重定义,定义的位置仅在相应的.h文件中。

        由于移植时把所有的头文件放在了一个自定义的头文件中,那就把这几个头文件都转移到了ov5640.h的头文件下,再次编译,错误依旧...

        寻求度娘帮助,有网友说明了两个原因,一个是确实出现了重定义。另一个原因是因为keil不支持相应.h文件放在其他.h文件下,需要转移到使用的.c文件下。尝试了下转移到应用的.c文件下,问题解决!

         由于长期使用VS软件做编程,习惯上将引用放置于相应头文件中,导致移植中这种莫名的错误。那问题就是,为何不能放置于.h文件夹下引用,仅仅是不支持吗...表示不理解。

<think>嗯,用户遇到了一个链接错误:L6200E,提示符号被重复定义。这个问题通常出现在嵌入式开发或者使用ARM编译工具链的时候,比如Keil MDK或者ARMCC。首先,我需要回忆一下这个错误的原因和解决办法。 首先,这个错误是说同一个符号在多个地方被定义了。也就是说,某个函数或者变量在多个源文件或者头文件中被重复定义,导致链接器无法确定该用哪一个。常见的情况可能有: 1. 在头文件里定义了全局变量或者函数,而没有使用防止重复包含的机制。例如,在头文件中写了int a;,然后多个.c文件包含这个头文件,每个.c文件编译后都会有一个a的定义,链接时就重复了。 2. 可能在不同的源文件中不小心定义了同名的全局变量或函数,尤其是名字拼写相同的情况。 3. 可能某个库被多次链接,或者头文件中的函数定义被多个源文件包含。 接下来,我需要思考用户可能的场景。用户可能在使用Keil进行STM32开发,或者类似的嵌入式项目,编译时出现这个错误。用户可能不太清楚如何找到重复定义的地方,或者如何正确使用头文件中的声明和定义。 需要告诉用户解决步骤。首先,检查错误信息中的符号名称,确定是哪个变量或函数重复了。然后,检查所有包含该符号的文件,看看是否在头文件中定义了变量而没有用extern,或者是否在多个.c文件中定义了相同的全局变量。 另外,需要提醒用户正确使用头文件的方法:头文件中只放声明,用extern关键字,而定义放在.c文件中。同时,确保头文件有#ifndef等防止重复包含的宏。 可能用户还不太清楚声明和定义的区别,需要解释一下,比如extern的作用。或者,是否在头文件中写了函数体,导致每个包含该头文件的源文件都有一份函数定义,导致重复。 还需要检查是否在多个模块中定义了同名的静态函数或变量,虽然静态的可能作用域在文件内,但如果变量名相同且在全局作用域,可能也会有冲突? 不过静态全局变量应该在各自文件内有效,不会冲突。所以可能还是非静态的全局变量重复了。 用户可能需要具体的例子,比如如何正确使用extern,或者如何用条件编译防止头文件重复包含。 总结下来,回答的结构应该是先解释错误原因,然后给出逐步排查的方法,最后给出解决方案和示例。确保用户能一步步检查自己的代码,找到重复定义的地方,并修正声明和定义的位置。</think>### 错误分析:`L6200E: Symbol multiply defined` 此错误是链接器(Linker)在编译过程中发现**同一个符号(函数或变量)被重复定义多次**导致的。常见于嵌入式开发(如Keil MDK、STM32项目)或C/C++项目。 --- ### 逐步排查与解决方案 #### 1. 定位重复符号 - **查看编译输出**:错误信息会明确提示重复符号的名称。例如: `L6200E: Symbol foo multiply defined (by main.o and module.o).` 表示符号 `foo` 在 `main.c` 和 `module.c` 中被重复定义。 #### 2. 检查代码结构 常见原因及修复方法: | 问题类型 | 错误示例 | 解决方案 | |--------------------|--------------------------------|----------------------------| | **头文件中定义变量** | `header.h` 中写 `int a;` | 改为声明:`extern int a;` 并在 `.c` 文件中定义 | | **重复定义全局变量** | `a.c` 和 `b.c` 均写 `int a;` | 保留一个定义,其他文件用 `extern` 声明 | | **函数重复实现** | `func()` 在多个 `.c` 文件中实现 | 确保函数仅在一个文件中定义 | | **头文件未加防护宏** | 未用 `#ifndef` 导致重复包含 | 添加头文件防护宏(见下方示例) | #### 3. 正确使用头文件 - **声明与定义分离**: ```c // header.h #ifndef MY_HEADER_H // 防护宏,防止重复包含 #define MY_HEADER_H extern int global_var; // 声明变量(不分配内存) void my_function(); // 声明函数 #endif ``` ```c // source.c #include "header.h" int global_var = 0; // 定义变量(分配内存) void my_function() { // 定义函数 // 函数体 } ``` #### 4. 检查静态链接库 - 如果使用静态库(`.a` 或 `.lib`),确保未将同一库多次链接到项目中。 - 检查编译选项,避免重复包含源文件。 #### 5. 其他可能原因 - **编译器配置问题**:检查IDE中是否误添加了重复的源文件。 - **拼写错误**:不同文件中意外定义了同名变量(如 `int counter` 和 `int Counter` 因大小写不同可能不冲突,但需注意编译器设置)。 --- ### 总结步骤 1. 根据错误信息定位重复符号。 2. 检查所有涉及该符号的文件: - 头文件是否误定义变量/函数? - 不同 `.c` 文件是否重复定义全局变量? 3. 使用 `extern` 声明变量,分离头文件与源文件定义。 4. 添加头文件防护宏。 5. 清理并重新编译项目。 通过以上步骤,可彻底解决 `L6200E` 错误
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值