2014-10-31 2 views
0

Просто пытаюсь выяснить, почему я получаю эту ошибку?Несколько определений в C

/import/ravel/1/cjmu065/cs1921/ass2/src/ImageList.c:21: multiple definition of `insert_at_tail' 
img.o:/import/ravel/1/cjmu065/cs1921/ass2/src/ImageList.c:21: first defined here 
ImageList.o: In function `printList': 
/import/ravel/1/cjmu065/cs1921/ass2/src/ImageList.c:43: multiple definition of `printList' 
img.o:/import/ravel/1/cjmu065/cs1921/ass2/src/ImageList.c:43: first defined here 
ImageList.o: In function `make_empty_list': 
/import/ravel/1/cjmu065/cs1921/ass2/src/ImageList.c:57: multiple definition of `make_empty_list' 

Единственные файлы, которые я использовал для создания этих функций, называют заголовочным файлом и последующим файлом реализации c.

Заголовочный файл включает в себя следующие объявления:

void printList(ImageList *list); 
ImageList *insert_at_tail(ImageList *list, char *name, QuadTree qtree, int dimen, int element); 
ImageList *make_empty_list(void); 

Хотя реализация имеет это:

ImageList *insert_at_tail(ImageList *list, char *name, QuadTree qtree, int dimen, int element){ 
    node_t *new; 
    new = malloc(sizeof(*new)); 
    assert(list!=NULL && new!=NULL); 
    new->data.dim = dimen; 
    new->data.num = element; 
    new->data.filename = malloc(strlen(name)*sizeof(char)); 
    strcpy(new->data.filename, name); 
    new->data.QuadTree = qtree; 
    new->next = NULL; 
    if(list->tail==NULL){ 
     list->head = list->tail = new; 
    } else { 
     list->tail->next = new; 
     list->tail = new; 
    } 
    return list; 
} 

// print a list (space-separated, on one line) 

void printList(ImageList *list) 
{ 
     node_t *cur; 

     for (cur = list->head; cur != NULL; cur = cur->next) { 
       printf("%d",cur->data.num); 
       printf(" [%2d]",cur->data.dim); 
       printf(" %s",cur->data.filename); 
     } 
     putchar('\n'); 
} 

// Make an empty list of images 

ImageList *make_empty_list(void) 
{ 
    ImageList *list; 
    list = malloc(sizeof(*list)); 
    assert(list!=NULL); 
    list->head = list->tail = NULL; 
    return list; 
} 

Я знаю, что причиной этого является то, как правило, из определения функции в файле заголовка но, похоже, я этого не сделал. Я просмотрел файлы, в которых я фактически использую эти функции, но нет дополнительных определений функций. Аргументы и возвращаемые значения также одинаковы для обоих файлов, поэтому я потерял. Любая помощь приветствуется.

CFLAGS=-Wall -g 

img : img.o QuadTree.o ImageList.o 
     gcc -o img img.o QuadTree.o ImageList.o 

img.o : img.c QuadTree.h ImageList.h 
     gcc $(CFLAGS) -c img.c 

QuadTree.o : QuadTree.c QuadTree.h 
     gcc $(CFLAGS) -c QuadTree.c 

ImageList.o : ImageList.c ImageList.h 
     gcc $(CFLAGS) -c ImageList.c 

clean : 
     rm -f img img.o QuadTree.o ImageList.o core 

Я добавил свой файл Makefile, возникла ли эта проблема? У меня также есть защитники от всех файлов заголовков, поэтому я все еще очень смущен, что-то не так с декларациями и определениями?

+1

Вы использовали безопасную охрану? – gsamaras

+0

Похоже, у вас есть два объектных файла ('ImageList.o' и' img.o'), которые определяют функции? –

+0

Попробуйте изменить определения файла заголовка, чтобы указать «extern» для определений – DrC

ответ

0

Глядя на почтовый файл я могу сказать пару вещей

1) Удалить quadtree.h из ImageList.c Поскольку вы уже включены в ImageList.h

2) Сделайте функцию инлайн. В quadtree.c в определении функции.

Я считаю, что это решит проблему.

+0

Спасибо за ответ. Однако make-файл по-прежнему выполняется, когда вы не меняете содержимое распакованного файла yeh? Что имеет quadtree.h как в imagelist.c, так и в imagelist.h. Я все еще просматриваю все свои файлы и не нахожу множественных определений. – sebajun

0

Расширение комментарий: использовать гарантию в включает не определить два раза одно и то же, если файл включен в несколько раз:

#ifndef HEADER_IMG_H 
#define HEADER_IMG_H 

void printList(ImageList *list); 
ImageList *insert_at_tail(ImageList *list, char *name, QuadTree qtree, int dimen, int element); 
ImageList *make_empty_list(void); 

#endif 

шаблон для этого является #ifndef HEADER_FILE_H #define HEADER_FILE_H ... здесь заявления. .. #endif.

+0

Спасибо за ваш ответ! Если вы посмотрите на файлы заголовков в Zip-файле, есть защитники. – sebajun

+0

в каком файле заголовка есть объявление для этих функций printList insert_at_tail и make_empty_list? –

+0

, пожалуйста, дайте полный почтовый индекс вашей текущей работы, это дано старше, что ваши изменения. –

Смежные вопросы