Gcc makefile error: "Нет правила для создания цели..."
Я пытаюсь использовать GCC (linux) с make файлом для компиляции моего проекта.
Я получаю следующую ошибку, которая не может быть расшифрована в этом контексте:
"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
Ответы
Ответ 1
Это обычно потому, что у вас нет файла с именем vertex.cpp
, доступного для создания. Убедитесь, что:
- этот файл существует.
- вы находитесь в правильном каталоге, когда вы делаете.
Кроме этого, мне нечего больше предлагать. Возможно, вы могли бы предоставить нам список каталогов этого каталога.
Ответ 2
По моему опыту, эта ошибка часто вызвана ошибкой орфографии.
Сегодня я получил эту ошибку.
make [1]: *** Нет правила, чтобы сделать цель maintenaceDialog.cpp', needed by
maintenaceDialog.o '. Стоп.
В моем случае ошибка была просто орфографической ошибкой. Слово "ТЕХНИЧЕСКОЕ ОБСЛУЖИВАНИЕ" отсутствовало у третьего N.
Также проверьте правописание на имена файлов.
Ответ 3
Более распространенная причина для этого сообщения заключается в том, что вы забыли указать каталог, в котором находится исходный файл. В результате gcc "думает", что этого файла не существует.
Вы можете добавить каталог с аргументом -I в gcc.
Ответ 4
В моем случае у меня были костяные запятые в качестве разделителей. Чтобы использовать ваш пример, я сделал следующее:
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
зафиксировал его.
Ответ 5
Это точно? Помните, что синтаксис Makefile является значком пробела и требует вкладок для команд отступа под действием.
Ответ 6
Проблема, которую я обнаружил, была еще глубже, чем другие люди упомянули.
Наши make файлы получают переданные списки вещей для сборки. Кто-то добавил TheOtherLibrary
в один из списков, как показано ниже.
LIBRARYDIRS = src/Library
LIBRARYDIRS = src/TheOtherLibrary
Они должны были сделать это:
LIBRARYDIRS = src/Library
LIBRARYDIRS += src/TheOtherLibrary
Если бы они сделали это вторым способом, они бы не уничтожили сборку Library
. Плюс в +=
очень важен.
Ответ 7
В моем случае это было связано с ошибкой многострочного правила в 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
...
Ответ 8
Если вы пытаетесь построить John the Ripper "bleeding-jumbo" и получите ошибку, например: make: *** Нет правила для создания "linux-x86-64". Вместо этого попробуйте запустить эту команду: ./configure && make
Ответ 9
Одной из частых ошибок может быть опечатка в другом имени файла.
Вы, к примеру, довольно просты, но иногда могут смущать
сообщений самого make
. Рассмотрим пример.
Содержимое моей папки:
$ ls -1
another_file
index.md
makefile
В то время как мой makefile
выглядит как
all: index.html
%.html: %.md wrong_path_to_another_file
@echo [email protected] $<
Хотя у меня есть 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 [email protected] $<
Только это даст нам желаемый результат:
$ make
index.html index.md
Ответ 10
В моем случае сообщение об ошибке ссылалось на старое имя файла, которое больше не существовало, потому что оно было переименовано. Оказалось, что устаревшая информация получена не из Makefile, а из файлов в .deps
.
Я столкнулся с этой ошибкой после копирования файлов с одной машины на другую. В этом процессе я предполагаю, что временные метки попали в несогласованное состояние, которое путало "сделать" при параллельном запуске нескольких заданий (аналогично этому отчету об ошибке).
Последовательные сборки с 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
После этого здание снова работало.
Ответ 11
Я получил ту же ошибку, когда копирую исходный каталог только в другое место.
Он был решен после того, как я переместил каталог Build.
Ответ 12
В моем случае исходный и/или старый объектный файл были заблокированы (только для чтения) с помощью полуразрушенной IDE или из резервной облачной службы, которая перестала работать должным образом. Перезагрузка всех программ и служб, связанных с структурой папок, решила проблему.
Ответ 13
Другой пример странной проблемы и ее решения:
Это:
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!
Ответ 14
В моем случае путь не задан в VPATH, после того как добавлена ошибка.
Ответ 15
Для этой ошибки существует несколько причин.
Одна из причин, почему я столкнулся с этой ошибкой, - это создание для linux и windows.
У меня есть имя файла с шапками BaseClass.h. SubClass.h. В Unix поддерживается регистр событий, зависящий от регистра, и окна не чувствительны к регистру.
C++, почему люди не используют прописные буквы в имени заголовочных файлов?
Попробуйте компилировать чистую сборку, используя gmake clean, если вы используете gmake
Некоторые текстовые редакторы имеют настройки по умолчанию, чтобы игнорировать имена файлов с учетом регистра. Это также может привести к той же ошибке.
как добавить файл C++ в Qt Creator, чье имя начинается с заглавных букв? Он автоматически делает это маленькой буквой
Ответ 16
У меня возникла проблема с функцией, которая была удалена. Я нашел ссылки на эту функцию в нескольких файлах метаданных в каталоге WBworkspace69.metadata.plugins. Я удалил эти файлы метаданных, и проблема исчезла.
Ответ 17
В моем случае это произошло из-за того, что я вызывал Makefile: MAKEFILE (все кепки)