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

时间:2014-05-26 07:08:51

标签: c linux gcc process

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的多重定义。我的.c程序文件中都使用file,但只在我的头文件中显示为变量。我不确定为什么会出现此错误。任何人都可以帮我解决这个错误吗?

1 个答案:

答案 0 :(得分:3)

如果你有多个.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文件都将访问自己的数据。