gnu make: Нет правила для создания целевого значения»%. c»

#gnu-make

#gnu-сделать

Вопрос:

Мне нужно использовать шаблонные правила для gnu make, но я всегда сталкиваюсь с одной и той же ошибкой:

сделайте: *** Нет правила для создания целевого значения»%. c», необходимого для «теста». Остановка.

Это мой файл создания:

 all: test test : %.c  gcc -o $@ $?  

Файл Makefile предназначен для создания файла выполнения из файлов .c в текущем каталоге, третья строка начинается с символа «tab». Я сделал это с помощью:

 make all  

Текущий каталог содержит два файла c внутри:

 -rw-rw-r-- 1 user user 43 Nov 27 11:18 test2.c -rw-rw-r-- 1 user user 109 Nov 27 11:01 test.c  

он всегда отвечает с одной и той же ошибкой %.c.

Я пытался:

  1. Назначьте имена файлов в файле Makefile явно вместо %.c, замените %.c на «test.c test2.c», он отлично работает.
  2. Создайте файл %.c в текущем каталоге, и он также отлично работает, потому что make может найти файл»%. c».

Моя версия make-это:

 $make --version GNU Make 4.2.1 Built for x86_64-pc-linux-gnu Copyright (C) 1988-2016 Free Software Foundation, Inc. License GPLv3 : GNU GPL version 3 or later lt;http://gnu.org/licenses/gpl.htmlgt; This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law.  

Я не знаю, почему функция правила шаблонов не работает.

Любые указания будут оценены по достоинству.

Комментарии:

1. Это правило all : %.c не является шаблонным правилом, но более важный вопрос заключается в следующем: что вы хотите make all сделать?

2. Я не думаю, что вы можете использовать правила шаблонов в качестве предварительного условия, не используя их в целевом объекте. Может ли что-то подобное all: $(wildcard *.c) сработать для вас?

3. Я изменил файл создания, чтобы показать свои намерения. Надеюсь, это поможет вам понять, что я хочу сделать.

4. Трудно вывести намерение из сценария, который не работает. Я думаю, что предложение @NickODell сработает, если ровно один исходный файл будет новее, чем test .

5. @Бета, скрипт не может работать-вот причина, по которой я разместил вопрос здесь. Мне просто нужно избегать перечисления всех файлов .c для компиляции. Является ли подстановочный знак единственным способом сделать это? для чего придумано правило шаблона?

Ответ №1:

Правило шаблона-это шаблон, который сообщает make, что если вы хотите создать цель, соответствующую этому целевому шаблону, и вы можете либо найти, либо создать необходимое условие, соответствующее шаблону(шаблонам), то вот рецепт, как это сделать.

Правило шаблона — это не определение, в котором говорится: «найдите все файлы, соответствующие этому шаблону, и используйте для них это правило».

Если вам нужен список исходных файлов, вы можете либо перечислить их вручную в своем файле makefile, либо использовать $(wildcard ...) для их поиска.