Неопределенная ссылка может быть makefile ошибочна?

у меня были некоторые проблемы ранее с объявлением моего набора записей массива. Теперь я думаю, что что-то не так с моим Makefile или что-то в этом роде.

вот мой Makefile:

EEXEC = proj1  
CC = gcc  
CFLAGS = -c -Wall  

$(EXEC) :   main.o set.o 
    $(CC) -o $(EXEC) main.o set.o 

main.o  :   main.h main.c
    $(CC) $(CFLAGS) main.c  

set.o   :   set.h set.c
    $(CC) $(CFLAGS) set.c   

есть больше функций, которые у меня есть в моем наборе.C файл, но это функции, которые я тестирую на данный момент:

DisjointSet *CreateSet(int numElements);  
DisjointSet *MakeSet(DisjointSet *S,int ele, int r);  
void Print(DisjointSet *S);

и ошибки, которые я получаю в терминале:

main.o: In function `main':  
main.c:(.text+0x19): undefined reference to `CreateSet'  
main.c:(.text+0x43): undefined reference to `MakeSet'  
main.c:(.text+0x5f): undefined reference to `Print'  

3 ответов


ошибки, которые вы получаете, являются ошибками компоновщика, сообщая вам, что при связывании вашей программы компоновщик не может найти функцию с именем "CreateSet" (и т. д.). Не сразу понятно, почему это должно быть так, потому что кажется, что вы включаете "set.o " в команде сборки.

для устранения неполадок сборки часто полезно выяснить, что make пытается сделать, а затем запускать команды по отдельности по одному, чтобы вы могли видеть, где все идет не так. "делать - n "покажет вам, какие команды "make" будут выполняться, фактически не выполняя их. Я ожидал бы увидеть такую команду, как:

gcc -o proj1 main.o set.o

попробуйте запустить это вручную и посмотреть, куда он вас приведет.


убедитесь, что вы включили набор.h в основном.c
Также вы объявляете EEXEC, но используете EXEC...


если они все на одной строке в файле makefile:

EEXEC = proj1 CC = gcc CFLAGS = -c -Wall

затем у вас есть один макрос EEXEC стоимость которого составляет proj1 CC = gcc CFLAGS = -c -Wall, а вы нет CC или CFLAGS макрос. CC вероятно, имеет значение по умолчанию,поэтому это работает.