Я пытаюсь использовать 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
VPATH=
вместоVPATH+=
. Это делает Makefile файл не может видеть файлы, когда файл на самом деле там.Ответы:
Обычно это потому, что у вас нет файла, который
vertex.cpp
можно сделать доступным. Проверь это:Кроме этого, я не могу больше предложить. Возможно, вы могли бы дать нам список каталогов этого каталога.
источник
По моему опыту, эта ошибка часто вызвана орфографической ошибкой.
Я получил эту ошибку сегодня.
В моем случае ошибка была просто орфографической ошибкой. Слово ТЕХНИЧЕСКОЕ ОБСЛУЖИВАНИЕ отсутствовало, это третий Н.
Также проверьте правильность написания ваших имен файлов.
источник
gcc -MT
и gnu make pattern может решить эту проблему. См также .../../src/file.c
но на самом деле это было../../src/folder/file.c
Более распространенная причина для печати этого сообщения заключается в том, что вы забыли включить каталог, в котором находится исходный файл. В результате gcc «думает», что этот файл не существует.
Вы можете добавить каталог, используя аргумент -I для gcc.
источник
В моем случае я использовал запятые в качестве разделителей. Чтобы использовать ваш пример, я сделал это:
Меняя его на эквивалент
починил это.
источник
Это точно? Помните, что синтаксис Makefile учитывает пробелы и требует вкладок для отступа команд под действиями.
источник
Проблема, которую я обнаружил, была еще глупее, чем то, о чем говорили другие.
Наши make-файлы получают списки объектов для сборки. Кто-то добавил
TheOtherLibrary
в один из списков, как показано ниже.Они должны были сделать это:
Если бы они сделали это вторым способом, они бы не уничтожили
Library
сборку. Плюс в+=
это очень важно.источник
В моем случае это было связано с ошибкой многострочного правила в Makefile. У меня было что-то вроде:
Обратная косая черта в конце списка файлов в
CONFIG_OBJ1
правиле вызвала эту ошибку. Это должно быть как:источник
Одной из частых ошибок может быть опечатка в другом имени файла .
Ваш пример довольно прост, но то, что иногда может сбивать с толку, - это сообщения о
make
себе. Давайте рассмотрим пример.Содержимое моей папки:
В то время как мой
makefile
выглядитХотя у меня есть ,
index.md
где она должна быть , и нет никакой ошибки в названии этого, сообщение отmake
будетЕсли честно, сообщение сбивает с толку . Это просто говорит, что нет правила. На самом деле это означает, что правило неверно, но из-за правил подстановочных знаков (шаблонов)
make
невозможно определить, что именно вызвало проблему.Давайте
makefile
немного изменим , то есть заменим шаблоны явными правилами:И теперь мы получим сообщение:
Чудо! Можно сделать следующие выводы:
Сообщения
make
зависят от правил и не всегда указывают на корень проблемМогут быть и другие проблемы,
makefile
отличные от указанных в этом сообщении.Теперь у нас есть идея проверить и другие зависимости в правиле :
Только это даст нам желаемый результат:
источник
В моем случае сообщение об ошибке ссылается на старое имя файла, которого больше не существует, поскольку оно было переименовано. Оказалось, что устаревшая информация пришла не из Makefile, а из файлов в
.deps
каталогах.Я столкнулся с этой ошибкой после копирования файлов с одного компьютера на другой. В этом процессе я предполагаю, что временные метки оказались в несогласованном состоянии, что приводило в замешательство «make» при параллельном запуске нескольких заданий (аналогично этому отчету об ошибке ).
Последовательные сборки с
make -j 1
не были затронуты, но мне потребовалось время, чтобы понять, потому что я использовал псевдоним (make -j 8
).Чтобы очистить состояние, я удалил все
.deps
файлы и восстановил Makefile. Это команды, которые я использовал:После этого здание снова заработало.
источник
Если вы пытаетесь собрать Джона Потрошителя "bleeding-jumbo" и получить сообщение об ошибке "make: *** Нет правила для создания цели 'linux-x86-64'". Попробуйте выполнить эту команду вместо:
./configure && make
источник
В моем случае исходный и / или старый объектный файл (ы) были заблокированы (только для чтения) в полуразрушенной IDE или из облачной службы резервного копирования, которая перестала работать должным образом. Перезапуск всех программ и служб, связанных со структурой папок, решил проблему.
источник
Еще один пример странной проблемы и ее решения:
Эта:
дает:
make[3]: *** No rule to make target '/usr/lib/libPocoFoundationd.so', needed by '../hello_poco/bin/mac/HelloPoco'. Stop.
Но если я удаляю
Poco_LIBRARIES
это работает:Я использую clang8 на Mac и clang 3.9 на Linux Проблема возникает только в Linux, но работает на Mac!
Я забыл упомянуть:
Poco_LIBRARIES
был неправ - он не был установлен cmake / find_package!источник
В моем случае путь не задан в VPATH, после того, как добавлена ошибка, исчезла.
источник
Есть несколько причин этой ошибки.
Одна из причин, по которой я столкнулся с этой ошибкой, - сборка для Linux и Windows.
У меня есть имя файла с заглавными буквами BaseClass.h SubClass.h, который поддерживает Unix, имеет соглашение о именовании файлов с учетом регистра, а в Windows регистр не учитывается.
C ++, почему люди не используют прописные буквы в именах заголовочных файлов?
Попробуйте скомпилировать чистую сборку с помощью gmake clean, если вы используете gmake
Некоторые текстовые редакторы имеют настройки по умолчанию для игнорирования имен файлов с учетом регистра. Это также может привести к той же ошибке.
как добавить файл C ++ в Qt Creator, имя которого начинается с заглавных букв? Это автоматически делает его маленькой буквой
источник
Эта ошибка произошла для меня в Travis, когда я забыл добавить новые файлы в мой репозиторий git. Глупая ошибка, но я вижу это довольно часто.
источник
В моем случае это произошло из-за того, что я вызвал Makefile: MAKEFILE (все заглавные буквы)
источник