多重定义collect2:错误:ld在C中返回1退出状态

Posted

技术标签:

【中文标题】多重定义collect2:错误:ld在C中返回1退出状态【英文标题】:Multiple definition collect2: error: ld returned 1 exit status in C 【发布时间】:2014-05-26 07:08:51 【问题描述】:

Process_struct.h //头文件

#define MAX_PROCS 5
#define EXIT 1
#define TRUE 1
/*******************************/
FILE *file=NULL;
/*******************************/
static FILE *outLog=NULL;
pthread_t producer;//Producer Thread ID
pthread_t consumer[MAX_PROCS];//consumer thread ID

这是我运行 Makefile 时遇到的错误:

    /tmp/ccvDJUQI.o:(.bss+0x8): multiple definition of `file'
    /tmp/cc4RWdZ4.o:(.bss+0x8): first defined here
    collect2: error: ld returned 1 exit status
    make: *** [Multiprocessor] Error 1

构建告诉我,我的程序中有多个file 定义。好吧,我调用文件的唯一部分是在我的头文件中。使用我上面的头文件代码,文件中没有file的多重定义。 file 在我的两个 .c 程序文件中都使用,但仅作为变量出现在我的头文件中。我不确定为什么会出现此错误。谁能帮我解决这个错误?

【问题讨论】:

我可以想象这样的错误,如果头文件被保留包含不受保护,然后包含到多个源文件中编译成一个库或其他东西......是这样吗?不过,将该文件定义为头文件看起来很奇怪。 redefinition c++的可能重复 @dragosht 并不是那个文件。我刚刚将其缩小到错误所在的位置并发布了该代码。 Mike 的可能重复主题对于理解这些概念也非常有用。它还涵盖了 C++ #pragma once 指令。 我知道概念,我是老师教的。他没有教我修复 collect2 错误。 【参考方案1】:

如果您有多个 .c 文件并将您的标头包含在其中,那么每个文件都将在其中定义该文件(因为预处理器只获取您的标头代码并在编译之前将其填充到其中)。如果您随后将它们编译在一起(如在库中),您将得到特定的链接器错误。

解决方案是移动这些定义: FILE *file=NULL; static FILE *outLog=NULL; pthread_t producer;//Producer Thread ID pthread_t consumer[MAX_PROCS];//consumer thread ID

只放入您的一个 .c 文件中。最终,您可以将它们留在标有 extern 关键字的标头中,让链接器知道它们是在其他地方定义的。在头文件中定义通常不是一个好习惯。头文件还应防止出现多个包含冲突,如下所示:

#ifndef MY_HEADER_H__
#define MY_HEADER_H__

... your code here

#endif

另一种解决方案是将它们全部静态化到您的标题中。但是,这意味着每个 .c 文件都将访问自己的数据。

【讨论】:

我尝试将 static 和 extern 添加到 FILE 中,但所做的只是给我更多错误,这些错误只是显示不应该存在的错误。 如果您在标题中将它们标记为外部,则应在您的 .c 文件之一中定义它们。否则链接器将看不到它们的定义并失败。 它们只需要定义一次。它们的定义相同,因为它们使用相同的变量,所以为什么不在头文件中定义它们需要的地方 这是关于该主题的其他一些有用的 SO 主题。也许这会更有帮助:***.com/questions/2216765/…

以上是关于多重定义collect2:错误:ld在C中返回1退出状态的主要内容,如果未能解决你的问题,请参考以下文章

collect2:错误:ld在c ++中返回1个退出状态[重复]

collect2:错误:ld 返回 1 退出状态,gcc

collect2:错误:ld 返回 1 退出状态 graphics.h

错误消息:在 crt1.10.6.ol 开始 ld:找不到符号 collect2:ld 返回 1 个退出状态

错误:未找到架构 x86_64 的符号,collect2:ld 返回 1 退出状态

Qt 创建者中的“collect2:ld 返回 1 个退出状态”