ошибка makefile gcc: "нет правила для создания цели …"

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

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

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

Это makefile:

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

17 ответов


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

  • что файл существует.
  • вы находитесь в нужном каталоге, когда вы делаете.

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


по моему опыту, эта ошибка часто вызвана правописание ошибка.

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

make[1]: * * * нет правила, чтобы сделать target maintenaceDialog.cpp', needed bymaintenaceDialog.o'. Остановка.

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

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


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

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


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

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

исправил.


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


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

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

LIBRARYDIRS = src/Library
LIBRARYDIRS = src/TheOtherLibrary

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

LIBRARYDIRS = src/Library
LIBRARYDIRS += src/TheOtherLibrary

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


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

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

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

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

Если вы пытаетесь построить John the Ripper " bleeding-jumbo "и получить ошибку типа"make: *** нет правила, чтобы сделать целевой "linux-x86-64"". Попробуйте вместо этого запустить эту команду:./configure && 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.

если честно сообщение совершенно неправильно. Давайте alter 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.

чудо! Можно сделать следующий вывод:--17-->

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

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

теперь мы придумали идею проверка других зависимостей в правиле а также:

all: index.html

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

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

$ make
index.html index.md

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

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

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

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

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

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


Я получил ту же ошибку, когда я копирую только исходный каталог в другое место.

Это было решено после того, как я переместил каталог сборки тоже.


в моем случае исходный и / или старые объектные файлы были заблокированы(только для чтения) полуразрушенной IDE или из резервной облачной службы, которая перестала работать должным образом. Перезапуск всех программ и служб, связанных со структурой папок, решил проблему.


еще один пример странной проблемы и ее решение:

Это:

target_link_libraries(
    ${PROJECT_NAME}
    ${Poco_LIBRARIES}
    ${Poco_Foundation_LIBRARY}
    ${Poco_Net_LIBRARY}
    ${Poco_Util_LIBRARY}
    )

выдает: make[3]: *** No rule to make target '/usr/lib/libPocoFoundationd.so', needed by '../hello_poco/bin/mac/HelloPoco'. Stop.

но если я удалить Poco_LIBRARIES работает:

target_link_libraries(
    ${PROJECT_NAME}
    ${Poco_Foundation_LIBRARY}
    ${Poco_Net_LIBRARY}
    ${Poco_Util_LIBRARY}
    )

я использую clang8 на Mac и clang 3.9 на Linux Проблема возникает только в Linux, но работает на Mac!

Я забыл упомянуть: Poco_LIBRARIES было неправильно-он не был установлен cmake / find_package!


в моем случае путь не установлен в VPATH, после добавления ошибки ушел.


существует несколько причин этой ошибки.

одна из причин, по которой я столкнулся с этой ошибкой при создании для linux и windows.

У меня есть класс с именем шапки.ч подкласс.ч Unix поддерживает соглашение об именовании файлов с учетом регистра,а windows-без учета регистра.

C++ почему люди не используют верхний регистр в имени заголовочных файлов?

попробуйте скомпилировать чистую сборку с помощью gmake clean, если вы используете команде gmake

некоторые текстовые редакторы имеют настройки по умолчанию для игнорирования имен файлов с учетом регистра. Это также может привести к той же ошибке.

как добавить файл C++ в Qt Creator, имя которого начинается с заглавных букв ? Это автоматически делает его маленькой буквой


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


в моем случае это было связано с тем, что я вызывал Makefile: MAKEFILE (все шапки)