#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.
Я пытался:
- Назначьте имена файлов в файле Makefile явно вместо %.c, замените %.c на «test.c test2.c», он отлично работает.
- Создайте файл %.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 ...)
для их поиска.