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文件都将访问自己的数据。