Próbuję użyć GCC (linux) z makefile do skompilowania mojego projektu.
Pojawia się następujący błąd, którego nie można odczytać w tym kontekście:
"No rule to make target 'vertex.cpp', needed by 'vertex.o'. Stop."
To jest plik 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
VPATH=
zamiastVPATH+=
. To sprawia, że plik Makefile nie widzi plików, gdy plik faktycznie tam jest.Odpowiedzi:
Dzieje się tak zwykle dlatego, że nie masz
vertex.cpp
dostępnego pliku o nazwie . Sprawdź to:Poza tym nie mam wiele innych sugestii. Być może mógłbyś podać nam katalog tego katalogu.
źródło
Z mojego doświadczenia wynika, że ten błąd jest często spowodowany błędem w pisowni .
Mam ten błąd dzisiaj.
W moim przypadku błąd był po prostu błędem pisowni. Brakowało słowa KONSERWACJA, jest to trzecie N.
Sprawdź także pisownię w swoich nazwach plików.
źródło
gcc -MT
a gnu tworzy wzory, może to rozwiązać. Zobacz także .../../src/file.c
ale tak naprawdę była../../src/folder/file.c
Najczęstszym powodem drukowania tego komunikatu jest to, że zapomniałeś dołączyć katalog, w którym znajduje się plik źródłowy. W rezultacie gcc „myśli”, że ten plik nie istnieje.
Możesz dodać katalog za pomocą argumentu -I do gcc.
źródło
W moim przypadku bezmyślnie użyłem przecinków jako separatorów. Aby skorzystać z twojego przykładu, zrobiłem to:
Zmiana na odpowiednik
naprawione.
źródło
Czy to dokładnie to? Pamiętaj, że składnia Makefile rozpoznaje białe znaki i wymaga wciskania tabulatorów do wcięcia poleceń w akcjach.
źródło
Problem, który znalazłem, był jeszcze głupszy niż to, o czym wspominali inni ludzie.
Nasze makefile otrzymują listę rzeczy do zbudowania. Ktoś dodał
TheOtherLibrary
do jednej z list, jak pokazano poniżej.Powinni byli to zrobić:
Gdyby zrobili to w drugą stronę, nie zniszczyliby
Library
kompilacji. Plus w+=
jest bardzo ważny.źródło
W moim przypadku było to spowodowane błędem reguły wieloliniowej w pliku Makefile. Miałem coś takiego:
Ukośnik odwrotny na końcu listy plików w
CONFIG_OBJ1
regule spowodował ten błąd. Powinno być jak:źródło
Jednym z częstych błędów może być literówka w innej nazwie pliku .
Twój przykład jest dość prosty, ale czasem mylące są
make
same wiadomości . Rozważmy przykład.Zawartość mojego folderu to:
Podczas gdy mój
makefile
wyglądaChociaż mam to,
index.md
gdzie powinno być i nie ma pomyłki w jego nazwie, wiadomość odmake
będzieSzczerze mówiąc, wiadomość jest myląca . Mówi tylko, że nie ma reguły. W rzeczywistości oznacza to, że reguła jest nieprawidłowa, ale z powodu symboli wieloznacznych (wzorców) reguły
make
nie mogą określić, co dokładnie spowodowało problem.Zmieńmy
makefile
trochę, co oznacza zastąpienie wzorców wyraźnymi regułami:A teraz otrzymamy wiadomość:
Cud! Można wyciągnąć następujące wnioski:
Wiadomości
make
zależą od reguł i nie zawsze wskazują na źródło problemówMogą występować inne problemy
makefile
niż określone w tym komunikacieTeraz wpadliśmy na pomysł sprawdzenia innych zależności w regule :
Tylko to zapewni nam pożądany rezultat:
źródło
W moim przypadku komunikat o błędzie odwoływał się do starej nazwy pliku, która już nie istniała, ponieważ zmieniono jej nazwę. Okazało się, że nieaktualne informacje nie pochodziły z Makefile, ale z plików w
.deps
katalogach.Wystąpił ten błąd po skopiowaniu plików z jednego komputera na inny. W tym procesie zakładam, że znaczniki czasu uzyskały niespójny stan, co pomieszało „make” podczas uruchamiania wielu zadań równolegle (podobnie do tego raportu o błędzie ).
make -j 1
Nie wpłynęło to na kompilacje sekwencyjne , ale zajęło mi to trochę czasu, ponieważ użyłem aliasu (make -j 8
).Aby wyczyścić stan, usunąłem wszystkie
.deps
pliki i ponownie wygenerowałem plik Makefile. Oto polecenia, których użyłem:Następnie budynek znów działał.
źródło
Jeśli próbujesz zbudować John the Ripper „bleeding-jumbo” i otrzymujesz błąd taki jak „make: *** Brak reguły, aby cel„ linux-x86-64 ””. Zamiast tego spróbuj uruchomić to polecenie:
./configure && make
źródło
W moim przypadku źródłowy i / lub stary plik (i) obiektu zostały zablokowane (tylko do odczytu) przez częściowo zawieszone IDE lub z usługi kopii zapasowej w chmurze, która przestała działać poprawnie. Ponowne uruchomienie wszystkich programów i usług powiązanych ze strukturą folderów rozwiązało problem.
źródło
Kolejny przykład dziwnego problemu i jego rozwiązanie:
To:
daje:
make[3]: *** No rule to make target '/usr/lib/libPocoFoundationd.so', needed by '../hello_poco/bin/mac/HelloPoco'. Stop.
Ale jeśli
Poco_LIBRARIES
go usunę , działa:Używam clang8 na Macu i clang 3.9 na Linuxie Problem występuje tylko w systemie Linux, ale działa na komputerze Mac!
Zapomniałem wspomnieć:
Poco_LIBRARIES
było źle - nie zostało ustawione przez cmake / find_package!źródło
W moim przypadku ścieżka nie jest ustawiona w VPATH, po dodaniu zniknął błąd.
źródło
Istnieje wiele przyczyn tego błędu.
Jednym z powodów, dla których napotkałem ten błąd, jest budowanie systemu Linux i Windows.
Mam nazwę pliku z dużymi literami BaseClass.h SubClass.h Unix utrzymuje konwencję rozróżniania wielkości liter w nazwach plików, a Windows nie rozróżnia wielkości liter.
C ++ dlaczego ludzie nie używają wielkich liter w nazwach plików nagłówkowych?
Spróbuj skompilować clean build przy użyciu gmake clean, jeśli używasz gmake
Niektóre edytory tekstu mają ustawienia domyślne, aby ignorować nazwy plików, w których rozróżniana jest wielkość liter. Może to również prowadzić do tego samego błędu.
jak dodać plik c ++ w Qt Creator, którego nazwa zaczyna się od wielkich liter? Automatycznie czyni to małą literą
źródło
Ten błąd wystąpił dla mnie w Travis, gdy zapomniałem dodać nowe pliki do mojego repozytorium git. Głupia pomyłka, ale widzę, że jest to dość powszechne.
źródło
W moim przypadku było to spowodowane tym, że zadzwoniłem do Makefile: MAKEFILE (wszystkie wielkie litery)
źródło