как исправить ошибку «нет правила для создания целевого %.o, необходимого всем. остановить ‘

#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 , поэтому он терпит неудачу.

Не совсем ясно, чего вы ожидаете от этого правила, поэтому я не могу сказать больше.