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 (все кепки)