C Makefile collect2:错误:

C Makefile collect2:错误:,c,gcc,C,Gcc,处理器c #include<time.h> #include<stdio.h> #include<pthread.h> #include<semaphore.h> #include<string.h> #include<stdlib.h> #include<malloc.h> #include<unistd.h> #include"Process_struct.h" sem_t empty;//se

处理器c

#include<time.h>
#include<stdio.h>
#include<pthread.h>
#include<semaphore.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
#include<unistd.h>
#include"Process_struct.h"

sem_t empty;//semaphores
#define MAX_PROCS 5
#define EXIT 1
#define TRUE 1

char outbaseStr [100];
int numProcessors;
FILE *outLog=NULL;
FILE *file=NULL;
FILE *outFile=NULL;
FILE *temp=NULL;
pthread_t producer;//Producer Thread ID
pthread_t consumer[MAX_PROCS];//consumer thread ID

int main(int argc, char *argv[])
{
    /* Initialize Data */
    initializeData();

    printf("argc equals %d\n", argc);
    int num_processors=atoi(argv[2]);
    int case_num=atoi(argv[3]);
    char filename;
    char *outfilename=argv[1];

    printf("outfilename equals %s\n", outfilename);
    printf("num_processors equals %d\n\n", num_processors);

    switch(case_num)
    {
    case 1:
        //printf("case 1\n");
        /* Reading in from the text  */

        file = fopen("temp.txt", "wr");

        /* fopen returns 0, the NULL pointer, on failure  */
        if(file==0||file==NULL)
        {
            printf("Error: couldn't open the file\n");
            exit(EXIT);
        }

/*****************************************************************************/
//write to temp
        int length=argc-4;
        for(int i=0;i<length;i++)
        {
            if(i%2==0)
            {
                //printf("%d ", atoi(argv[i+3]));
                fprintf(file, "%d ", atoi(argv[i+4]));
            }
            else
            {
                //printf("%d\n", atoi(argv[i+3]));
                fprintf(file,"%d\n", atoi(argv[i+4]));
            }
        }

/*****************************************************************************/

        fclose(file);
        file = fopen("temp.txt", "r");

        /* Create the producer thread  */
        pthread_create(&producer, NULL, get_request, (void *)file);

        break;
    case 2:

        //char filename[100];
        //filename=argv[3];
        //printf("usage: %s filename\n", argv[3]);


        /* Reading in from the text  */
        file = fopen(argv[4], "r");

        /* fopen returns 0, the NULL pointer, on failure  */
        if(file==0||file==NULL)
        {
            printf("Error: couldn't open the file\n");
            exit(EXIT);
        }


        /* Create the producer thread  */
        pthread_create(&producer, NULL, get_request, (void *)file);

        break;
    default:
        printf("Error: should be either case 1 or case 2\n");
        exit(EXIT);
        break;
    }

    pthread_join(producer, NULL);


    //displayQ();


    // Create the consumer threads
    for(int i=0;i<num_processors;i++)
    {

        sprintf(outbaseStr, "%s.%ld", outfilename, (long)(i+1));
        //printf("outbaseStr equals %s\n", outbaseStr);
        outLog=fopen(outbaseStr, "w");
        if(outLog==NULL)
        {
            printf("Error: couldn't open the file\n");
            exit(EXIT);
        }

        pthread_create(&consumer[i], NULL, processor, (void *)outLog);
    }


    for(int i=0;i<num_processors;i++)
    {
        pthread_join(consumer[i], NULL);
    }

    //printf("\nfclose\n");
    close((FILE *)file);
    //fclose((FILE *)file);

    if(case_num==1)
    {
        if(remove("temp.txt")!=0)
        {
            printf("error deleting file");
        }
        else
        {
            //printf("success deleting file");
        }
    }

}

每当我去运行make文件时,我都会遇到这个错误。我不知道错误会在哪里,所以我无法找到并更改它。我希望有人能告诉我collect2:error:ld returned 1 exit status是什么意思,以及错误会出现在哪里。

从您的评论来看,您似乎正在尝试编译头文件

gcc Processor.c Process\u struct.h Process\u struct.c-o多处理器-std=c99-lm-lpthread

头文件包含在
.c
文件中,不单独编译。您的命令行应该更像

gcc Processor.c Process_struct.c-o多处理器-std=c99-lm-lpthread


此类错误的另一个来源是在头文件中定义变量并将头文件包含在多个源文件中,例如在
Process\u struct.h

FILE *file = NULL;
char temp[] = "/tmp";
当您在
Processor.c
Process\u struct.c
中包含此头文件时,您可以在两个源中定义这些变量,从而获得多个定义的变量

要解决这个问题,您不能定义,而只能声明头文件中的变量。然后可以在一个源文件中定义它们,例如

Process\u struct.h

extern FILE *file;
extern char temp[];
过程结构c
中:

FILE *file = NULL;
char temp[] = "/tmp";

多个定义的另一个来源就是,您在多个地方定义了相同的变量。这意味着当你

处理器c:

FILE *file = NULL;
char temp[] = "/tmp";
过程结构c:

FILE *file = NULL;
char temp[] = "/tmp";
您将得到这个错误。解决方法取决于您的意图。如果这些变量是文件的局部变量(彼此独立),则通过在前缀中添加
static

static FILE *file = NULL;
static char temp[] = "/tmp";
但是,如果希望在这两个源之间共享变量,则必须保留一个定义,并仅将另一个定义作为声明。更好的是,将声明移动到头文件,并将定义仅保留在一个源文件中,如上面的第二部分所示


在任何情况下,您都应该稍微改变makefile的结构。尽可能多地使用内置规则,请参阅。例如


对于所有正在寻找collect2:error:ld返回1退出状态答案的用户,请记住,将头文件中的所有变量设置为静态变量非常有用。这就是我的错误消失的原因,因此对于所有其他用户来说,这可能是您错误的答案。

您在编译什么?要提供更多上下文吗?这意味着在编译时符号会出现多次。很遗憾,我们需要更多的信息…您使用什么命令行进行编译?一个主c文件,一个函数c文件,以及与之对应的头文件。多处理器:Processor.c Process\u struct。Process_struct.h gcc Processor.c Process_struct.h Process_struct.c-o Multiprocessor-std=c99-lm-lpthread您的代码中有一个错误(您没有发布)。然后必须显示您的源代码。也许在头文件中有一个定义而不是声明。当您多次包含定义时,您会在链接时收到这些错误消息。编辑问题并添加源代码。我的头文件中只有我的定义和函数调用,并且在我的C文件中被调用。如果头文件中有定义,则这就是错误的原因。请参阅更新的答案。在头文件中包含静态变量怎么样?如果您是指具有文件局部作用域的变量,例如,
static int foo=5,那么这也会产生错误吗,这不会导致多定义错误。但请记住,现在你有了多个独立变量。即使这样做没有什么坏处,但仍建议将定义保留在源文件中,而不是头文件中。请注意,执行此操作时,每个单元都有这些变量的单独副本。如果将它们设置为头文件中的
extern
,则所有单元共享一个变量。如果您真的想要单独的副本,最好在头文件中根本不提及它们。
FILE *file = NULL;
char temp[] = "/tmp";
FILE *file = NULL;
char temp[] = "/tmp";
static FILE *file = NULL;
static char temp[] = "/tmp";
CFLAGS = -std=c99 -pthread
LDLIBS = -lm -lpthread
OBJS = Processor.o Process_struct.o

Multiprocessor: $(OBJS)
    $(CC) $(CFLAGS) -o $@ $(OBJS) $(LDLIBS)