ZBLOG

Rebuild started: Project: BH-F103 *** Using Compiler 'V5.06 update 4 (build 422)', folder: 'C:\Users\Yuluoqiao\AppData\Local\Keil_v5\ARM\ARMCC\Bin' Rebuild target 'BH-F103' compiling main.c... compiling stm32f10x_crc.c... compiling stm32f10x_bkp.c...

根据您提供的构建日志和错误信息:

Error: L6200E: Symbol I2C_Init multiply defined (by stm32f10x_i2c.o and i2c.o).

这表明 I2C_Init 函数在 i2c.cstm32f10x_i2c.c 中都有定义,导致链接器无法决定使用哪一个。以下是一些解决方案,可以帮助您解决这个问题:

解决方案步骤

  1. 查找重复定义
    • 检查 i2c.cstm32f10x_i2c.c 中是否都实现了 I2C_Init 函数。只保留其中一个的实现。
   // 假设这是在 i2c.c 文件中
   void I2C_Init() {
       // ... 实现 ...
   }

   // 如果 stm32f10x_i2c.c 也有类似定义,请删除或注释掉它。
  1. 确保只有一个函数实现

    • 确认您的项目中没有其他源文件或库中有同名函数。如果可能的话,您可以重命名其中一个版本以避免冲突。
  2. 使用头文件声明

    • 如果需要在多个文件中调用该函数,请仅在一个源文件中提供其实现,并在其他需要调用的源文件中使用 extern 声明。例如:

i2c.h 头文件中:

   #ifndef I2C_H
   #define I2C_H

   void I2C_Init(); // 声明函数

   #endif // I2C_H
  1. 包含保护

    • 确保所有头文件都用 include guards(防止重复包含)进行保护,以避免多重包含引起的问题。
  2. 清理并重新构建项目

    • 一旦对代码进行了修改,务必清理项目(Clean),然后重新构建(Rebuild)。这样做将确保所有旧的编译结果被删除,新的更改得到正确应用。

示例调整

在 i2c.h 文件中的示例:

// i2c.h
#ifndef I2C_H
#define I2C_H

void I2C_Init(); // 声明函数

#endif // I2C_H

在 i2c.c 文件中的示例:

#include "i2c.h"

void I2C_Init() {
    // ... 实现 ...
}

注意事项

  • 如果您不确定哪些源文件引用了此功能,可以使用文本搜索工具查找整个项目目录中的 I2C_Init 关键字。

  • 查看文档以确认如何正确组织 STM32 的库,以免出现与库本身的符号冲突。

遵循上述步骤后,再次尝试构建您的项目。如果仍然遇到问题,请检查具体代码或分享更多相关代码片段,以便进一步分析。


内容由零声教学AI助手提供,问题来源于学员提问

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://sdn.0voice.com/?id=7595

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?