2009-05-07 7 views
264

Я пытаюсь использовать GCC (linux) с make-файлом для компиляции моего проекта.gcc makefile error: «Нет правила, чтобы сделать цель ...»

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

"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

Типичный пример вы сделать "исходный файл«не существует»является сбросом VPATH или переменной SRC по ошибке, когда вы должны добавить к нему. Я имею в виду usnig 'VPATH =' вместо 'VPATH + ='. Это делает файл Makefile не может видеть файлы, когда файл на самом деле там. –

ответ

309

Это, как правило, потому что у вас нет файла vertex.cpp. Убедитесь, что:

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

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

+1

Да, некоторые из моих классов не имеют .cpp-файлов, поэтому их не было, что вызвало ошибку. Благодарю. – Meir

+2

, вы также можете получить такую ​​ошибку, если есть некоторые файлы заголовков, которые вы удалили, но все еще находитесь в вашем файле Makefile. – ady

+0

Допустим, вы отлаживаете файл make, и вы хотите только запустить вторую половину. Так что действительно вы не имеете кода, запущенного в файле make, чтобы сделать файл vertex.cpp (вы прокомментировали это в коде, но действительно vertext.cpp существует в каталоге). Как бы вы могли запустить файл make в этих условиях? – par

9

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

+0

Сохранял меня! Спасибо –

+0

Сохранял меня тоже. Благодаря! – m4grio

22

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

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

5

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

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

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

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

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

У меня сегодня была эта ошибка.

make[1]: *** No rule to make target maintenaceDialog.cpp', needed by maintenaceDialog.o'. Stop.

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

Также проверьте правописание на свои имена.

+2

Мета _why_, в данном случае из-за явного перечисления отношений объекта/источника/заголовка. Если более новые инструменты, такие как _SubCons_ или _CMake_, не будут пробовать, 'gcc -MT' и gnu make шаблоны могут решить эту проблему. См. Также [также] (http://mad-scientist.net/make/autodep.html). –

+1

На самом деле, это _third_ 'n', но ваш вопрос по-прежнему действителен :-) – paxdiablo

+2

Я просто подумал:« Да, я делал это много раз, но, конечно, не в этот раз? » Я смотрю на свою ошибку и обнаружил 'MyMen' вместо' MyMem' – Raekye

11

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

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

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

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

LIBRARYDIRS = src/Library 
LIBRARYDIRS = src/TheOtherLibrary 

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

LIBRARYDIRS = src/Library 
LIBRARYDIRS += src/TheOtherLibrary 

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

-2

В моем случае, это было из-за меня вызовом Makefile: Makefile (все заглавные буквы)

0

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

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

2

Если вы пытаетесь построить John the Ripper «bleeding-jumbo» и получите сообщение «make: *** No rule to make target» linux-x86-64 ». Вместо этого попробуйте запустить эту команду: ./configure && make

0

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

0

Другой пример странной проблемы и ее решение:

Это:

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} 
    ) 

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

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

1

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

Вы, к примеру, довольно понятны, но иногда могут быть смущены сообщения от 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 
+0

Спасибо! Из-за такой проблемы я слишком долго задерживался! –

0

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

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

Последовательные сборки с 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 

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

0

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

Смежные вопросы