Помилка make-файлу gcc: "Немає правила для цілі ..."


355

Я намагаюся використовувати 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

2
Типовий приклад, який ви робите 'вихідним файлом' не існує ', - скиданням змінної VPATH або SRC помилково, коли вам доведеться до неї додати. Я маю на увазі усніг VPATH=замість VPATH+=. Це робить файл Makefile не може бачити файли, коли файл насправді є.
Чан Кім

Відповіді:


424

Це зазвичай тому, що у вас немає файлу, який називається vertex.cppдоступним для створення. Перевірте, що:

  • цей файл існує.
  • ви знаходитесь у правильному каталозі, коли ви робите.

Окрім цього, я не багато чого пропоную. Можливо, ви могли б дати нам список цього каталогу.


2
Так, деякі мої класи не мають .cpp-файлів, тому їх там не було, що спричинило помилку. Дякую.
Меїр

4
Ви також можете отримати таку помилку, якщо ви видалили декілька файлів заголовків, які все ще є у вашому Makefile
ady

@par, це для мене схоже на інше питання. Ви, ймовірно, отримаєте більше експозиції, якщо задасте це як питання.
paxdiablo

Крім того, переконайтеся, що ви зберегли свій Makefile після його редагування ... Саме це і отримало мене. Я зробив усі свої зміни, тоді забув натиснути CTRL + S
Тім

80

На мій досвід, ця помилка часто викликана орфографічною помилкою.

Я сьогодні отримав цю помилку.

make [1]: *** Немає правила робити цільове maintenaceDialog.cpp', needed bymaintenaceDialog.o '. Стій.

У моєму випадку помилка була просто орфографічною помилкою. У слові ОБСЛУГОВУВАННЯ пропущено третє N.

Також перевірте написання ваших імен файлів.


2
Мета чому , в цьому випадку - через чітке перерахування співвідношень об'єкт / джерело / заголовок. Якщо нові інструменти, такі як SubCons або CMake , не на смак, gcc -MT і gnu make візерунки можуть це вирішити. Дивіться також .
Натан Кідд

Ти врятував мій день! Дякую! :)
Sunit Gautam

У моєму випадку шлях був невірним, ../../src/file.cале насправді він був../../src/folder/file.c
Расмі Ранджан Наяк

31

Більш поширеною причиною друку цього повідомлення є те, що ви забули включити каталог, у якому знаходиться вихідний файл. Як результат, gcc "думає", що цей файл не існує.

Ви можете додати каталог за допомогою аргументу -I до gcc.


14

У моєму випадку я мав кості, які використовували кості як роздільники. Для використання вашого прикладу я зробив це:

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

виправили це.


11

Це саме так? Пам’ятайте, що синтаксис Makefile відомий пробілом і вимагає вкладок для відступу команд під діями.


7

Проблема, яку я знайшов, була навіть дурнішою, ніж те, про що згадували інші.

Наші файли передають переліки речей, які потрібно створити. Хтось додав TheOtherLibraryдо одного зі списків, як показано нижче.

LIBRARYDIRS = src/Library
LIBRARYDIRS = src/TheOtherLibrary

Вони повинні були зробити це:

LIBRARYDIRS = src/Library
LIBRARYDIRS += src/TheOtherLibrary

Якби вони зробили це другим способом, вони б не знищили Libraryзбірку. Плюс в +=дуже важливий.


6

У моєму випадку це було пов’язано з помилкою багаторядкових правил у 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
...

5

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

Ви, наприклад, досить просто, але те, що іноді може заплутати, - це повідомлення про 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.

Якщо чесно, повідомлення заплутане . Це просто говорить, що немає правила. Насправді це означає, що це правило неправильне, але в силу шаблону (шаблону) правила makeне можуть визначити, що саме спричинило проблему.

Дозволяє 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 $@ $<

Тільки це забезпечить нам бажаний результат:

$ make
index.html index.md

3

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

Я зіткнувся з цією помилкою після копіювання файлів з однієї машини на іншу. У цьому процесі я припускаю, що часові позначки отримали непослідовний стан, який плутав "make" при виконанні декількох завдань паралельно (подібно до цього звіту про помилку ).

Послідовні побудови з 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

Після цього будівля запрацювала знову.


2

Якщо ви намагаєтеся побудувати Джона Розпушувача "кровоточить-джамбо" і отримуєте помилку на кшталт "make: *** Немає правила робити ціль '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}
    )

Я використовую clang8 на Mac та clang 3.9 в Linux Проблема виникає лише в Linux, але працює на Mac!

Я забув згадати: Poco_LIBRARIESпомилявся - це не було встановлено cmake / find_package!


0

У моєму випадку шлях не встановлений у VPATH, після доданої помилки зникла.


0

Причин цієї помилки є кілька.

Однією з причин, з якою я стикався з цією помилкою, є під час створення для Linux та Windows.

У мене є ім'я файлів з ковпачками BaseClass.h SubClass.h, який підтримує Unix, має залежно від регістру назву файлових файлів, і Windows не враховує регістри.

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

Спробуйте скласти чисту збірку за допомогою gmake clean, якщо ви використовуєте gmake

Деякі текстові редактори мають налаштування за замовчуванням, щоб ігнорувати регістри імен файлів. Це також може призвести до тієї ж помилки.

як додати файл c ++ у Qt Creator, ім'я якого починається з великих літер? Це автоматично робить його малою буквою


0

Ця помилка трапилася для мене всередині Travis, коли я забув додати нові файли до свого сховища git. Дурне помилка, але я можу бачити, що це досить часто.


-1

У моєму випадку це було викликано тим, що я називав Makefile: MAKEFILE (усі літери)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.