Правило шаблона Makefile не работает? - PullRequest
9 голосов
/ 01 марта 2011

При использовании GNU-make мой Makefile имеет некоторое шаблонное правило:

%.o:%.c
    gcc $< -o:$@

Это правило добавлено мной.

Но когда я делаю это, он выдает ошибку, говорящую, что нет правила делать цель% .o, и не создает цели.

Иногда бывает и другое поведение. Он не создает цель, когда я говорю «сделать первый раз» (выдает ошибку, в которой говорится, что правило «создать цель» отсутствует), но когда я говорю «сделать снова немедленно», он строится правильно.

Таким образом, когда я определяю каждый исходный файл отдельно, он сам в первый раз строит цели точно.

РЕДАКТИРОВАТЬ: я использую GNU-make на Centos (v6.3 я думаю, не уверен). Может ли это быть какое-то разрешение / идентификатор пользователя / идентификатор группы?

Есть ли какие-либо указатели, чтобы понять, что может происходить, и решения для этого?

спасибо, -AD.

Ответы [ 5 ]

14 голосов
/ 04 марта 2011

Make использует шаблонное правило только как запасной вариант. Например:

$ ls
Makefile
$ cat Makefile
%.o: %.c
    gcc $< -o $@
$ make
make: *** No targets.  Stop.

Это хорошо. Make не учитывает правило шаблона, так как вы не просили его сделать что-либо, и в make-файле нет цели по умолчанию. Давайте попросим его сделать что-то, что могло бы использовать шаблонное правило.

$ make 1.o
make: *** No rule to make target `1.o'.  Stop.

Ожидаемое. 1.c не существует, поэтому правило шаблона не учитывается. Давайте попробуем еще раз.

$ touch 1.c
$ make 1.o
gcc 1.c -o 1.o

(а затем какая-то ошибка, связанная с отсутствием основного).

Лично мне сильно не нравятся эти запасные правила. Я предпочитаю перечислять цели явно. Что-то вроде

file.o file2.o f.o: %.o: %.c
    ...

дает вам целевое правило шаблона. Они совершенно разные (см. Руководство). [О, и шаблон не дает вам никакого преимущества в этом странном примере.]

1 голос
/ 27 февраля 2013

Просто пробежал эту проблему.

Если это ваше правило:

%.o:%.c
    gcc $< -o:$@

Убедитесь, что у вас есть табуляция, а не пробелы во второй строке перед gcc. Мне понадобилось пару часов, чтобы разобраться. Также нет ':' после флага -o, как кто-то еще указал.

1 голос
/ 01 марта 2011

Возможно, вам понадобятся пробелы вокруг : в первой строке вашего правила. Кроме того, gcc не принимает двоеточие перед именем выходного файла; просто используйте -o $@.

0 голосов
/ 23 мая 2018

Если вы поместите только это в Makefile и вызовете make :

%.o: %.cpp
  g++ -g -o $@ -c $<

Это говорит: make: *** No targets. Stop.

Потому что это не цель.Это правило.

Оно будет работать, если вашей другой цели нужен файл .o .

main.exe: main.o add.o
  g++ -g -o $@ $^

%.o: %.cpp
  g++ -g -o $@ -c $<
0 голосов
/ 28 марта 2013

Вы уверены, что файл .c существует?Я думаю, что использование -d, как предлагалось ранее, должно помочь отладить это.

...