【问题标题】:What could be the reason for getting the error "multiple definitions" while linking?链接时出现“多个定义”错误的原因可能是什么?
【发布时间】:2023-03-29 21:05:01
【问题描述】:

我不断收到错误,我的函数已被多次定义。当然,我的文件中只有一个文件和一个具有该名称的函数。 gcc 在哪里可以找到其他定义?

这是一个示例错误消息,但我收到了很多:

/tmp/ccerCzAD.o:main.c:(.text+0xdb):

首先在这里定义

/tmp/ccGbaGfJ.o:在函数'at'中:

dlist.c:(.text+0xe3): `at'的多重定义

我包括了“stdio.h”和“stdlib.h”。函数“at()”可能已经在其中一个中定义了吗?

【问题讨论】:

    标签: c gcc


    【解决方案1】:

    也许您是在头文件中定义函数,而不是声明它。

    int at(void); /* 声明 */
    int at(void) { return 0; } /* 定义 */

    通常的方法是将声明放在头文件中,将定义放在代码文件中。

    【讨论】:

    • 我将把它标记为已接受的答案,因为它基本上就是我所做的。虽然我不确定为什么在这种情况下我会得到多个定义。
    • 在阅读了您对 Tom 的回答的评论后,我认为您正在编译 dlist.c 两次:一次是通过命令行参数,另一次是通过包含在 main.c 中。
    • 是的,这很有道理。感谢您帮助我。
    【解决方案2】:

    函数 at 似乎在文件 dlist.c 和 main.c 中定义

    会是这样吗?

    文件 dlist.h

    int at();
    

    文件 dlist.c

    int at(){return 0;}
    

    文件 main.c

    #include "dlist.h"
    
    int at(){return 1;}
    int main()
    {
           return at();
    }
    

    【讨论】:

    • 或者他把int at(){return 0;}放在头文件里? ??
    • 感谢您的回答。这实际上不是我的问题,但它让我意识到我的错误。我不小心把“dlist.c”而不是“dlist.h”放在“main.c”中。
    【解决方案3】:

    您可能还想:

    #ifndef _DLIST_H
    #define _DLIST_H
    
    int at();
    
    #endif
    

    为了防止在使用#include 在多个.c 文件中包含相同的标头时出现相同的错误。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-05-10
      • 2012-04-15
      • 2021-02-28
      • 2013-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多