kesalahan gcc makefile: "Tidak ada aturan untuk membuat target ..."

356

Saya mencoba menggunakan GCC (linux) dengan makefile untuk mengkompilasi proyek saya.

Saya mendapatkan kesalahan berikut yang sepertinya tidak bisa diuraikan dalam konteks ini:

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

Ini adalah 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
Meir
sumber
2
Contoh tipikal Anda 'membuat' file sumber 'tidak ada' adalah dengan mengatur ulang variabel VPATH atau SRC secara tidak sengaja saat Anda harus menambahkannya. Maksud saya usnig VPATH=bukan VPATH+=. Ini membuat file Makefile tidak bisa melihat file ketika file itu benar-benar ada.
Chan Kim

Jawaban:

425

Itu biasanya karena Anda tidak memiliki file yang disebut vertex.cpptersedia untuk dibuat. Periksa itu:

  • file itu ada.
  • Anda berada di direktori yang benar ketika Anda membuatnya.

Selain itu, saya tidak punya banyak saran. Mungkin Anda bisa memberi kami daftar direktori dari direktori itu.

paxdiablo
sumber
2
Ya, beberapa kelas saya tidak memiliki file .cpp, jadi tidak ada yang menyebabkan kesalahan. Terima kasih.
Meir
4
Anda juga bisa mendapatkan kesalahan seperti itu jika ada beberapa file header yang Anda hapus tetapi masih ada di Makefile Anda
ady
@par, itu tampak seperti pertanyaan yang berbeda dengan saya. Anda mungkin akan mendapatkan lebih banyak paparan jika Anda mengajukannya sebagai pertanyaan.
paxdiablo
Juga, pastikan Anda menyimpan Makefile Anda setelah mengeditnya ... Itulah yang membuat saya. Saya melakukan semua pengeditan kemudian lupa menekan CTRL + S
Tim
80

Dalam pengalaman saya, kesalahan ini sering disebabkan oleh kesalahan ejaan .

Saya mendapat kesalahan ini hari ini.

make [1]: *** Tidak ada aturan untuk membuat target maintenaceDialog.cpp', needed bymaintenaceDialog.o '. Berhenti.

Dalam kasus saya, kesalahannya hanyalah kesalahan pengejaan. Kata MAINTENANCE tidak ada, itu N. ketiga

Periksa juga ejaan pada nama file Anda.

Wes
sumber
2
Meta mengapa , dalam hal ini adalah karena secara eksplisit daftar hubungan objek / sumber / header. Jika alat yang lebih baru seperti SubCons atau CMake tidak sesuai selera, gcc -MT dan gnu membuat pola dapat mengatasi ini. Lihat juga .
Nathan Kidd
Kamu menyelamatkan hariku! Terima kasih! :)
Sunit Gautam
Dalam kasus saya jalan itu salah seperti ../../src/file.ctetapi sebenarnya itu../../src/folder/file.c
Rasmi Ranjan Nayak
31

Alasan yang lebih umum untuk pesan ini dicetak adalah karena Anda lupa memasukkan direktori tempat file sumber berada. Akibatnya, gcc "berpikir" file ini tidak ada.

Anda dapat menambahkan direktori menggunakan argumen -I ke gcc.


sumber
14

Dalam kasus saya, saya menggunakan koma tanpa tulang sebagai pemisah. Untuk menggunakan contoh Anda, saya melakukan ini:

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

Mengubahnya menjadi setara dengan

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

memperbaikinya.

Nick Knowlson
sumber
11

Apakah itu tepat? Ingat bahwa sintaks Makefile adalah spasi putih dan membutuhkan tab untuk membuat indentasi perintah.

workmad3
sumber
7

Masalah yang saya temukan bahkan lebih konyol daripada yang disebutkan orang lain.

Makefile kami melewati daftar hal-hal yang harus dibangun. Seseorang ditambahkan TheOtherLibraryke salah satu daftar, seperti yang ditunjukkan di bawah ini.

LIBRARYDIRS = src/Library
LIBRARYDIRS = src/TheOtherLibrary

Mereka seharusnya melakukan ini:

LIBRARYDIRS = src/Library
LIBRARYDIRS += src/TheOtherLibrary

Jika mereka melakukannya dengan cara kedua, mereka tidak akan memusnahkan Librarybangunan. Nilai tambah +=sangat penting.

kmort
sumber
6

Dalam kasus saya itu karena kesalahan aturan multi-line di Makefile. Saya punya sesuatu seperti:

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

Garis miring terbalik pada akhir daftar file dalam CONFIG_OBJ1aturan menyebabkan kesalahan ini. Itu harus seperti:

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

Salah satu kesalahan yang sering terjadi adalah salah ketik nama file lain .

Contoh Anda cukup mudah tetapi yang terkadang membingungkan adalah pesan make itu sendiri. Mari kita pertimbangkan sebuah contoh.

Konten folder saya adalah:

$ ls -1
another_file
index.md
makefile

Sedangkan aku makefileterlihat seperti

all: index.html

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

Meskipun saya memiliki di index.mdmana seharusnya dan tidak ada kesalahan dalam nama itu, pesan dari makeakan

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

Jujur saja pesannya membingungkan . Itu hanya mengatakan, bahwa tidak ada aturan. Bahkan, itu berarti bahwa aturannya salah, tetapi karena aturan wildcard (pola)make tidak dapat menentukan apa yang menyebabkan masalah tersebut.

Mari kita ubah makefilesedikit, yaitu mengganti pola dengan aturan eksplisit:

index.html: index.md wrong_path_to_another_file

Dan sekarang pesan yang kita dapatkan adalah:

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

Keajaiban! Berikut ini dapat disimpulkan:

  • Pesan maketergantung pada aturan dan tidak selalu mengarah ke akar masalah

  • Mungkin ada masalah lain di Anda yang makefileberbeda dari yang ditentukan oleh pesan ini

Sekarang kami telah datang dengan gagasan untuk memeriksa dependensi lain dalam suatu aturan juga:

all: index.html

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

Hanya ini yang akan memberi kami hasil yang diinginkan:

$ make
index.html index.md
Nick Roz
sumber
3

Dalam kasus saya, pesan kesalahan merujuk ke nama file lama, yang tidak ada lagi karena diganti namanya. Ternyata informasi yang ketinggalan zaman tidak berasal dari Makefile, tetapi dari file di .depsdirektori.

Saya mengalami kesalahan ini setelah menyalin file dari satu mesin ke komputer lain. Dalam proses itu, saya menganggap cap waktu masuk dalam keadaan tidak konsisten, yang membingungkan "membuat" ketika menjalankan beberapa pekerjaan secara paralel (mirip dengan laporan bug ini ).

Build berurutan dengan make -j 1tidak terpengaruh, tetapi butuh beberapa saat untuk menyadari karena saya menggunakan alias ( make -j 8).

Untuk membersihkan keadaan, saya menghapus semua .depsfile dan membuat ulang Makefile. Ini adalah perintah yang saya gunakan:

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

Setelah itu, bangunan kembali berfungsi.

Philipp Claßen
sumber
2

Jika Anda mencoba membangun John the Ripper "bleeding-jumbo" dan mendapatkan kesalahan seperti "make: *** Tidak ada aturan untuk membuat target 'linux-x86-64'". Coba jalankan perintah ini sebagai gantinya:./configure && make

Ogglas
sumber
0

Dalam kasus saya, sumber dan / atau file objek lama dikunci (hanya baca) oleh IDE semi-crash atau dari layanan cloud cadangan yang berhenti berfungsi dengan benar. Restart semua program dan layanan yang terkait dengan struktur folder menyelesaikan masalah.

sskoog
sumber
0

Contoh lain dari masalah aneh dan solusinya:

Ini:

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

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

Tetapi jika saya menghapusnya Poco_LIBRARIESberfungsi:

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

Saya menggunakan clang8 di Mac dan clang 3.9 di Linux Masalahnya hanya terjadi di Linux tetapi berfungsi di Mac!

Saya lupa menyebutkan: Poco_LIBRARIESsalah - tidak diset oleh cmake / find_package!

Mike Mitterer
sumber
0

Dalam kasus saya, jalan tidak diatur dalam VPATH, setelah menambahkan kesalahan hilang.

tzuhsun
sumber
0

Ada beberapa alasan untuk kesalahan ini.

Salah satu alasan di mana saya mengalami kesalahan ini adalah saat membangun untuk linux dan windows.

Saya memiliki nama file dengan capsClassClass.

C ++ mengapa orang tidak menggunakan huruf besar dalam nama file header?

Coba kompilasi build bersih menggunakan gmake clean jika Anda menggunakan gmake

Beberapa editor teks memiliki pengaturan default untuk mengabaikan nama file case-sensitive. Ini juga dapat menyebabkan kesalahan yang sama.

bagaimana cara menambahkan file c ++ di Qt Creator yang namanya dimulai dengan huruf kapital? Secara otomatis membuatnya menjadi huruf kecil

corning
sumber
0

Kesalahan ini terjadi pada saya di dalam Travis ketika saya lupa menambahkan file baru ke repositori git saya. Kesalahan konyol, tapi saya bisa melihatnya cukup umum.

Ryan Deschamps
sumber
-1

Dalam kasus saya, itu karena saya memanggil Makefile: MAKEFILE (semua huruf besar)

ninjaPixel
sumber