鑫海457 2024-04-30 17:24 采纳率: 0%
浏览 3
已结题

IAR程序莫名变量多重定义

我在使用IAR去编写一段硅麦程序的时候无法make成功,显示我的定义的变量名字存在重复定义,但是它显示的重复定义的位置是我编写的另一段不同功能的函数的运行函数(.o文件不知道我说的是否正确),在写代码的时候并不存在所谓的重复定义。

img

img

  • 写回答

20条回答 默认 最新

  • 专家-皆知 2024-04-30 17:24
    关注
    获得0.15元问题酬金

    参考免费微信小程序:皆我百晓生 作答,经由专家-皆知整理回复,如问题解决,望采纳;如仍有疑问,请评论回复。

    根据您提供的信息,问题在于编译时提示变量多重定义错误,但您确认代码中没有直接的重复定义。这种情况下,问题通常出在变量的作用域、存储类型或者是由于不同的源文件中未正确使用extern关键字来声明全局变量。

    首先,检查以下几个方面来定位问题:

    1. 全局变量声明与定义:确保所有在多个源文件中使用的全局变量仅在一个源文件中定义,并且在其他使用到这些变量的源文件中使用extern进行声明。例如,如果您在zf_common_headfile.h中定义了全局数组mic_raw_data,确保这个定义只出现一次,并且在其他需要用到这个数组的.c文件中,通过extern声明而不是重新定义。

      正确的做法是在一个.c文件中定义:

      uint16 mic_raw_data[4][MIC_RAW_DATA_LEN];
      

      然后在zf_common_headfile.h或其他需要使用它的文件中声明:

      extern uint16 mic_raw_data[4][MIC_RAW_DATA_LEN];
      
    2. 检查头文件包含:确保没有循环包含头文件或者在头文件中直接定义变量。如果多个头文件相互包含,可能会导致变量被间接多次定义。

    3. 编译器预处理器输出:使用IAR的预处理器输出功能来查看最终的编译单元,这可以帮助您了解哪些文件包含了哪些定义,从而找到可能的多重定义来源。在IAR中,可以通过项目选项的C/C++ Compiler -> Preprocessor页签,勾选“Generate preprocessed listing file”来生成预处理文件。

    4. 静态局部变量:如果问题变量实际上是静态局部变量,请注意它们在每个编译单元中是独立存在的,不会引起跨文件的多重定义错误,但可能因为变量名相同而在理解上造成混淆。

    5. 编译单位的链接顺序:虽然不太常见,但在某些编译器和链接器设置下,链接顺序可能导致已定义的符号被后面的定义覆盖。检查项目的链接顺序是否有误。

    如果以上都没有问题,尝试简化问题场景,逐一排查涉及的文件,逐步缩小问题范围。如果能提供具体的错误信息(错误号和行号),那将更有利于定位问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 5月8日
  • 赞助了问题酬金15元 4月30日
  • 创建了问题 4月30日

悬赏问题

  • ¥15 微信小程序商城如何实现多商户收款 平台分润抽成
  • ¥15 HC32L176调试了一个通过TIMER5+DMA驱动WS2812B
  • ¥15 cocos的js代码调用wx.createUseInfoButton问题!
  • ¥15 关于自相关函数法和周期图法实现对随机信号的功率谱估计的matlab程序运行的问题,请各位专家解答!
  • ¥15 Python程序,深度学习,有偿私
  • ¥15 扫描枪扫条形码出现问题
  • ¥35 poi合并多个word成一个新word,原word中横版没了.
  • ¥15 【火车头采集器】搜狐娱乐这种列表页网址,怎么采集?
  • ¥15 求MCSCANX 帮助
  • ¥15 机器学习训练相关模型