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

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多重定义。 该file是用于我的两个.c程序文件,但只出现在我的头文件作为variables。 我不知道为什么会出现这个错误。 任何人都可以帮我解决这个错误?

如果你有多个.c文件,并且包含你的头文件,那么他们每个人都会在里面定义这个文件(因为预处理程序只是把你的头文件代码放在里面)。 如果你一起编译它们(就像在库中一样),你将会得到那个特殊的链接器错误。

解决办法是移动这些定义: FILE *file=NULL; static FILE *outLog=NULL; pthread_t producer;//Producer Thread ID pthread_t consumer[MAX_PROCS];//consumer thread ID 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文件都将访问自己的数据。