#c #makefile #gnu-make
#c #makefile #gnu-make
Вопрос:
Когда я набираю make и нажимаю enter, он говорит:
no rule to make target %.o, needed by all. stop'.
Это мой makefile:
CC=g
LDFLAGS=""
all: %.o %.h
$(CC)
lt; $(LDFLAGS) -o bin
%.o: %.cpp %.h
$(CC) -c
lt;
Это содержимое моего каталога:
$ ls
main.cpp makefile
Я новичок в GNU make и только что научился использовать автоматические переменные. Кто-нибудь может мне помочь?
Ответ №1:
% предназначен для замены шаблонов, что вам нужно при определении правила для одного модуля (как вы это делали), но не то, что вы хотите в качестве списка зависимостей «все». % расширится до одного значения.
Вместо этого вы хотите, чтобы фактический подстановочный знак (например, в расширении оболочки) соответствовал всем файлам * .o . Итак, измените определение цели на
all: *.o *.h
Ответ №2:
Не связано с вашим вопросом, но это неправильно:
LDFLAGS=""
make не анализирует кавычки, поэтому вы установили переменную LDFLAGS
в буквальную строку ""
(две двойные кавычки). Когда вы используете это в своем рецепте:
$(CC)
lt; $(LDFLAGS) -o bin
это будет так, как если бы вы набрали:g ... "" -o bin
что является синтаксической ошибкой (вы передаете пустой аргумент
g
. Если вам нужна пустая переменная, вы просто пишете:LDFLAGS =
Теперь ваша проблема. Это не шаблонное правило:
all: %.o %.h
Правило шаблона должно содержать шаблон в цели (в левой части двоеточия). Поскольку это явное правило, обязательными условиями (правая часть двоеточия) являются литеральные строки
%.o
и%.h
. Make не знает, как создать файл с именем%.o
, поэтому он терпит неудачу.Не совсем ясно, чего вы ожидаете от этого правила, поэтому я не могу сказать больше.