Ошибка make-файла gcc: «Нет правила для создания цели ...» - PullRequest
316 голосов
/ 07 мая 2009

Я пытаюсь использовать GCC (linux) с make-файлом для компиляции моего проекта.

Я получаю следующую ошибку, которая не может расшифроваться в этом контексте:

"No rule to make target 'vertex.cpp', needed by 'vertex.o'.  Stop."

Это make-файл:

a.out: vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o
    g++ vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o

main.o: main.cpp main.h
    g++ -c main.cpp

vertex.o: vertex.cpp vertex.h
    g++ -c vertex.cpp

edge.o: edge.cpp edge.h
    g++ -c num.cpp

vlist.o: vlist.cpp vlist.h
    g++ -c vlist.cpp

elist.o: elist.cpp elist.h
    g++ -c elist.cpp

vnode.o: vnode.cpp vnode.h
    g++ -c vnode.cpp

enode.o: enode.cpp enode.h
    g++ -c node.cpp

Ответы [ 18 ]

379 голосов
/ 07 мая 2009

Обычно это потому, что у вас нет файла с именем vertex.cpp, доступного для создания. Проверьте, что:

  • этот файл существует.
  • Вы находитесь в правильном каталоге, когда делаете.

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

67 голосов
/ 23 апреля 2012

По моему опыту, эта ошибка часто вызывается ошибкой орфографии .

Я получил эту ошибку сегодня.

make [1]: *** Нет правила для создания цели maintenaceDialog.cpp', needed by maintenaceDialog.o '. Стоп.

В моем случае ошибка была просто орфографической ошибкой. Слово ТЕХНИЧЕСКОЕ ОБСЛУЖИВАНИЕ отсутствовало, это третья буква N.

Также проверьте правильность написания ваших имен файлов.

26 голосов
/ 24 августа 2009

Более распространенная причина печати этого сообщения заключается в том, что вы забыли включить каталог, в котором находится исходный файл. В результате gcc «думает», что этот файл не существует.

Вы можете добавить каталог, используя аргумент -I для gcc.

12 голосов
/ 24 июня 2012

В моем случае я использовал запятые в качестве разделителей. Чтобы использовать ваш пример, я сделал это:

a.out: vertex.o, edge.o, elist.o, main.o, vlist.o, enode.o, vnode.o
    g++ vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o

Изменение его на эквивалент

a.out: vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o
    g++ vertex.o edge.o elist.o main.o vlist.o enode.o vnode.o

исправил.

10 голосов
/ 07 мая 2009

Это точно? Помните, что синтаксис Makefile учитывает пробелы и требует вкладок для отступа команд под действиями.

7 голосов
/ 11 февраля 2014

Проблема, которую я обнаружил, была еще глупее, чем упоминали другие люди.

Наши make-файлы получают списки объектов для сборки. Кто-то добавил TheOtherLibrary в один из списков, как показано ниже.

LIBRARYDIRS = src/Library
LIBRARYDIRS = src/TheOtherLibrary

Они должны были сделать это:

LIBRARYDIRS = src/Library
LIBRARYDIRS += src/TheOtherLibrary

Если бы они сделали это вторым способом, они бы не уничтожили сборку Library. Плюс в += очень важен.

6 голосов
/ 06 июня 2011

В моем случае это было связано с ошибкой многострочного правила в Makefile. У меня было что-то вроде:

OBJS-$(CONFIG_OBJ1)            += file1.o file2.o \
                                  file3.o file4.o \
OBJS-$(CONFIG_OBJ2)            += file5.o 
OBJS-$(CONFIG_OBJ3)            += file6.o
...

Обратная ошибка в конце списка файлов в правиле CONFIG_OBJ1 вызвала эту ошибку. Это должно быть как:

OBJS-$(CONFIG_OBJ1)            += file1.o file2.o \
                                  file3.o file4.o
OBJS-$(CONFIG_OBJ2)            += file5.o
...
3 голосов
/ 24 декабря 2017

В моем случае сообщение об ошибке ссылается на старое имя файла, которого больше не существует, поскольку оно было переименовано. Оказалось, что устаревшая информация пришла не из файла Makefile, а из файлов в каталогах .deps.

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

Последовательные сборки с make -j 1 не были затронуты, но мне потребовалось некоторое время, чтобы понять, потому что я использовал псевдоним (make -j 8).

Чтобы очистить состояние, я удалил все файлы .deps и восстановил Makefile. Вот команды, которые я использовал:

find | grep '.deps' | xargs rm
find | grep '.deps' | xargs rmdir
autoreconf --install # (optional, but my project is using autotools) 
./configure

После этого здание снова заработало.

2 голосов
/ 01 мая 2015

Если вы пытаетесь собрать Джона Потрошителя "bleeding-jumbo" и получаете сообщение об ошибке "make: *** Нет правил для создания цели" linux-x86-64 "". Попробуйте выполнить эту команду вместо: ./configure && make

2 голосов
/ 04 июля 2017

Одной из частых ошибок может быть опечатка в другом имени файла .

Ваш пример довольно прост, но иногда можно смутить сообщения самого make. Давайте рассмотрим пример.

Содержимое моей папки:

$ ls -1
another_file
index.md
makefile

В то время как мой makefile выглядит как

all: index.html

%.html: %.md wrong_path_to_another_file
    @echo $@ $<

Хотя у меня есть index.md там, где он должен быть, и в его названии нет ошибки, сообщение от make будет

make: *** No rule to make target `index.html', needed by `all'.  Stop.

Если честно сообщение совершенно неверно . Давайте немного изменим makefile, то есть заменим шаблоны на явные правила:

index.html: index.md wrong_path_to_another_file

А теперь мы получим сообщение:

make: *** No rule to make target `wrong_path_to_another_file', needed by `index.html'.  Stop.

Чудо! Можно сделать следующие выводы:

  • Сообщения make зависят от правил и не всегда указывают на корень проблем

  • В вашем makefile могут быть другие проблемы, отличные от указанных в этом сообщении

Теперь у нас есть идея проверять и другие зависимости в правиле :

all: index.html

%.html: %.md another_file
    @echo $@ $<

Только это даст нам желаемый результат:

$ make
index.html index.md
...