gcc makefile hatası: “Hedef yapmak için kural yok…”


356

Projemi derlemek için bir makefile ile GCC (linux) kullanmaya çalışıyorum.

Bu bağlamda deşifre edemeyen aşağıdaki hatayı alıyorum:

"No rule to make target 'vertex.cpp', needed by 'vertex.o'.  Stop."

Bu 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
Kaynak dosyayı 'yok' olarak 'verdiğiniz' tipik bir örnek, VPATH veya SRC değişkenini, eklemeniz gerektiğinde yanlışlıkla sıfırlamaktır. Yani VPATH=yerine usnig VPATH+=. Bu, Makefile dosyası, dosya gerçekten orada olduğunda dosyaları göremez hale getirir.
Chan Kim

Yanıtlar:


425

Bunun nedeni genellikle vertex.cpphazır olarak adlandırılabilir bir dosyanızın olmamasıdır . Şunu kontrol et:

  • bu dosya var.
  • oluşturduğunuzda doğru dizindesiniz.

Bunun dışında önerecek çok şeyim yok. Belki de bize o dizinin bir dizin listesini verebilirsiniz.


2
Evet, bazı sınıflarımda .cpp dosyası yok, bu yüzden orada değillerdi - hataya neden oldu. Teşekkürler.
Meir

4
Kaldırdığınız ancak yine de Makefile'nizde
ady

@par, bu benim için farklı bir soru gibi görünüyor. Bir soru olarak sorarsanız muhtemelen daha fazla maruz kalabilirsiniz .
paxdiablo

Ayrıca, Makefile'inizi düzenledikten sonra kaydettiğinizden emin olun ... Tüm düzenlemelerimi yaptım ve CTRL + S tuşlarına basmayı unuttum
Tim

80

Deneyimlerime göre, bu hata genellikle bir yazım hatası nedeniyle oluşur .

Bugün bu hatayı aldım.

make [1]: *** Hedef maintenaceDialog.cpp', needed bybakımı yapmak için kural yokDialog.o '. Dur.

Benim durumumda hata sadece bir yazım hatasıydı. MAINTENANCE kelimesi eksik, üçüncü N.

Ayrıca dosya adlarınızdaki yazım denetimini de yapın.


2
Meta neden , bu durumda çünkü açıkça nesne / kaynak / başlık ilişkileri listeleme taşımaktadır. SubCons veya CMake gibi daha yeni araçların tadı yoksa gcc -MT ve gnu desenleri bunu çözebilir. Bkz ayrıca .
Nathan Kidd

Günümü kurtardın! Teşekkür ederim! :)
Sunit Gautam

Benim durumumda yol yanlıştı ../../src/file.cama aslında öyleydi../../src/folder/file.c
Rasmi Ranjan Nayak

31

Bu iletinin yazdırılmasının en yaygın nedeni, kaynak dosyanın bulunduğu dizini eklemeyi unutmanızdır. Sonuç olarak, gcc bu dosyanın mevcut olmadığını "düşünür".

Dizini -cc argümanını kullanarak gcc'ye ekleyebilirsiniz.


14

Benim durumumda ayırıcı olarak kemik başlı virgül kullandım. Örneğinizi kullanmak için şunu yaptım:

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

Bunu eşdeğerine değiştirme

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

onu düzeltti.


11

Tam olarak bu mu? Makefile sözdiziminin boşluktan haberdar olduğunu ve eylemler altındaki komutları girintilemek için sekmeler gerektirdiğini unutmayın.


7

Buldum sorun bile diğer millet ne söyledi daha sillier oldu.

Markalarımız, oluşturulacak şeylerin listesini geçirir. Birisi TheOtherLibraryaşağıda gösterildiği gibi listelerden birine ekledi .

LIBRARYDIRS = src/Library
LIBRARYDIRS = src/TheOtherLibrary

Bunu yapmalıydılar:

LIBRARYDIRS = src/Library
LIBRARYDIRS += src/TheOtherLibrary

İkinci yolla yapsaydı, yapıyı silmeyeceklerdi Library. Artı +=çok önemlidir.


6

Benim durumumda bu Makefile çok satırlı bir kural hatası nedeniyle oldu. Gibi bir şey vardı:

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

CONFIG_OBJ1Kuralının dosya listesinin sonundaki ters eğik çizgi bu hataya neden oldu. Şöyle olmalı:

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

5

Sık yapılan hatalardan biri başka bir dosya adında yazım hatası olabilir .

Örneğiniz oldukça basittir, ancak bazen kafa karıştırıcı olabilecek şey makekendi mesajlarıdır . Bir örnek ele alalım.

Klasör içeriğim:

$ ls -1
another_file
index.md
makefile

Halbuki benim makefilegibi

all: index.html

%.html: %.md wrong_path_to_another_file
    @echo $@ $<

Ben rağmen index.mdolması gereken yerde ve bunun adına hata yok, gelen mesaj makeolacak

make: *** No rule to make target `index.html', needed by `all'.  Stop.

Dürüst olmak gerekirse , mesaj kafa karıştırıcıdır . Sadece kural yok diyor. Aslında, kuralın yanlış olduğu anlamına gelir, ancak joker karakter (desen) kuralları makenedeniyle soruna tam olarak neyin neden olduğunu belirleyemez.

Biraz değiştirelim makefile, yani kalıpları açık kurallarla değiştirin:

index.html: index.md wrong_path_to_another_file

Ve şimdi aldığımız mesaj şöyle olacak:

make: *** No rule to make target `wrong_path_to_another_file', needed by `index.html'.  Stop.

Mucize! Aşağıdaki sonuçlara varılabilir:

  • Mesajlar makekurallara bağlıdır ve her zaman sorunların kökenine işaret etmez

  • makefileBu mesajda belirtilenden farklı başka sorunlar olabilir

Şimdi bir kuraldaki diğer bağımlılıkları da kontrol etme fikrini bulduk :

all: index.html

%.html: %.md another_file
    @echo $@ $<

Sadece bu bize istenen sonucu sağlayacaktır:

$ make
index.html index.md

3

Benim durumumda, yeniden adlandırıldığı için artık var olmayan eski bir dosya adına atıfta bulunan hata iletisi. Eski bilgilerin Makefile'den değil, .depsdizinlerdeki dosyalardan geldiği ortaya çıktı .

Dosyaları bir makineden diğerine kopyaladıktan sonra bu hatayla karşılaştım. Bu süreçte, zaman damgalarının, birden fazla işi paralel olarak çalıştırırken ( bu hata raporuna benzer şekilde ) karışık hale getiren, tutarsız bir duruma geldiğini varsayıyorum .

Sıralı derlemeler make -j 1etkilenmedi, ancak bir takma ad ( make -j 8) kullandığım için fark etmem biraz zaman aldı .

Durumu temizlemek için hepsini kaldırdım .deps dosyaları ve Makefile'i yeniden oluşturdum. Bunlar benim kullandığım komutlar:

find | grep '.deps' | xargs rm
find | grep '.deps' | xargs rmdir
autoreconf --install # (optional, but my project is using autotools) 
./configure

Bundan sonra bina yeniden çalıştı.


2

Ripper John'u "bleeding-jumbo" oluşturmaya ve "make: *** Hedef 'linux-x86-64' 'yapmak için kural yok gibi bir hata alıyorsanız. Bunun yerine bu komutu çalıştırmayı deneyin:./configure && make


0

Benim durumumda, kaynak ve / veya eski nesne dosyaları yarı çökmüş bir IDE veya düzgün çalışmayı durduran bir yedekleme bulut hizmetinden kilitlendi (salt okunur). Klasör yapısıyla ilişkili tüm programların ve hizmetlerin yeniden başlatılması sorunu çözdü.


0

Garip bir sorunun başka bir örneği ve çözümü:

Bu:

target_link_libraries(
    ${PROJECT_NAME}
    ${Poco_LIBRARIES}
    ${Poco_Foundation_LIBRARY}
    ${Poco_Net_LIBRARY}
    ${Poco_Util_LIBRARY}
    )

verir: make[3]: *** No rule to make target '/usr/lib/libPocoFoundationd.so', needed by '../hello_poco/bin/mac/HelloPoco'. Stop.

Ama kaldırırsam Poco_LIBRARIESçalışır:

target_link_libraries(
    ${PROJECT_NAME}
    ${Poco_Foundation_LIBRARY}
    ${Poco_Net_LIBRARY}
    ${Poco_Util_LIBRARY}
    )

Mac'te clang8 ve Linux'ta clang 3.9 kullanıyorum Sorun yalnızca Linux'ta oluşuyor, ancak Mac'te çalışıyor!

Bahsetmeyi unuttum: Poco_LIBRARIESyanlıştı - cmake / find_package tarafından ayarlanmadı!


0

Benim durumumda yol VPATH olarak ayarlanmadı, sonra hata gitti.


0

Bu hatanın birçok nedeni vardır.

Ben bu hatayla karşılaşma nedenlerinden biri linux ve pencereler için inşa ederken.

Ben BaseClass.h SubClass.h kapaklar ile bir dosya adı var Unix korur büyük / küçük harf duyarlı dosya düzenleme kural vardır ve windows büyük / küçük harf duyarsız.

Neden insanlar üstbilgi dosyaları adına büyük harf kullanmıyorsunuz?

Gmake kullanıyorsanız temiz yapıyı gmake kullanarak derlemeyi deneyin

Bazı metin düzenleyicilerin büyük / küçük harf duyarlı dosya adlarını yoksaymak için varsayılan ayarları vardır. Bu aynı hataya neden olabilir.

Qt Creator'da adı büyük harflerle başlayan bir c ++ dosyası nasıl eklenir? Otomatik olarak küçük harf yapar


0

Git deposuma yeni dosyalar eklemeyi unuttuğumda bu hata Travis içinde benim için oluştu. Aptalca bir hata, ama oldukça yaygın olduğunu görebiliyorum.


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.