Краткий ответ : этот синтаксис работает не так, как вы этого хотите.Правильный способ сделать то, что вы хотите в GNU make синтаксисе, - это использовать правила шаблонов:
public%.o: public%.c hashtable.h
$(CC) $(CFLAGS) -c $<
public%: public%.o
$(CC) -o $@ $<
Длинный ответ : Это:
public*.o: public*.c hashtable.h
не означаетчто вы хотите, чтобы это значило.Предполагая, что у вас есть несколько файлов public01.c
и т. Д., И нет файлов public01.o
и т. Д. В начале сборки, этот синтаксис эквивалентен следующему:
public*.o: public01.c public02.c public03.c ... hashtable.h
То есть, если public01.o
и т. Д., Не существует, тогда make будет использовать буквенную строку public*.o
в качестве имени файла.Если некоторые из файлов .o
существуют, то этот синтаксис эквивалентен следующему:
public01.o public02.o ...: public01.c public02.c ... hashtable.h
Похоже на то, что вы хотите, верно?Но это обычное недопонимание с make, потому что на самом деле эта строка точно такая же, как эта:
public01.o: public01.c public02.c ... hashtable.h
public02.o: public01.c public02.c ... hashtable.h
То есть - каждый файл .o
зависит от каждого файла .c
!Правильный способ сделать то, что вы хотите, это использовать правило шаблона, как показано выше.