Просто пытаюсь выяснить, почему я получаю эту ошибку?Несколько определений в 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, возникла ли эта проблема? У меня также есть защитники от всех файлов заголовков, поэтому я все еще очень смущен, что-то не так с декларациями и определениями?
Вы использовали безопасную охрану? – gsamaras
Похоже, у вас есть два объектных файла ('ImageList.o' и' img.o'), которые определяют функции? –
Попробуйте изменить определения файла заголовка, чтобы указать «extern» для определений – DrC