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
,但只在我的头文件中显示为变量。我不确定为什么会出现此错误。任何人都可以帮我解决这个错误吗?
答案 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文件都将访问自己的数据。