Makefiles и подстановочные знаки - PullRequest
4 голосов
/ 05 июля 2011

Хорошо, так что это мои текущие настройки для make-файла.Есть файлы с именами public01.c, public02.c и т. Д. Я пытаюсь создать объектные файлы для каждого из них, используя метку public*.o с подстановочным знаком.

public*.o: public*.c hashtable.h
    $(CC) $(CFLAGS) -c public*.c

public*: public*.o
    $(CC) -o public* public*.o

Однако, когдаЯ пытаюсь запустить make-файл, я получаю это:

make: *** No rule to make target `public*.c', needed by `public*.o'.  Stop.

Я думаю, это трактует public*.c как метку, а не подстановочный знак, как мне бы хотелось.Я прочитал о функции $(wildcard pattern...) и поиграл с ней, но я не совсем понял ее или заставил работать ...

Ответы [ 2 ]

12 голосов
/ 05 июля 2011

Краткий ответ : этот синтаксис работает не так, как вы этого хотите.Правильный способ сделать то, что вы хотите в 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!Правильный способ сделать то, что вы хотите, это использовать правило шаблона, как показано выше.

0 голосов
/ 05 июля 2011

Эта ошибка обычно возникает, потому что gcc считает, что файл не существует. Убедитесь, что он существует, и убедитесь, что вы находитесь в каталоге, где он существует, и тогда он должен работать.

Кроме того, по какой причине у вас нет $ (CFLAGS) для публики *? Почему именно это публично *? Я полагаю, что достаточно иметь «публичность».

...