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

问题描述 投票:0回答:2

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 程序文件中都使用,但仅作为变量出现在我的头文件中。我不确定为什么会出现这个错误。谁能帮我解决这个错误?

c linux gcc process
2个回答
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 文件将访问自己的数据。


0
投票

最好修复代码以避免重复定义。如果这不是一个选项并且它们是相同的定义,则一个选项可能是告诉链接器忽略重复的定义并通过添加此指令来使用第一个定义

LDFLAGS="-Wl,-allow-multiple-definition"

© www.soinside.com 2019 - 2024. All rights reserved.