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
VPATH=
bukanVPATH+=
. Ini membuat file Makefile tidak bisa melihat file ketika file itu benar-benar ada.Jawaban:
Itu biasanya karena Anda tidak memiliki file yang disebut
vertex.cpp
tersedia untuk dibuat. Periksa itu:Selain itu, saya tidak punya banyak saran. Mungkin Anda bisa memberi kami daftar direktori dari direktori itu.
sumber
Dalam pengalaman saya, kesalahan ini sering disebabkan oleh kesalahan ejaan .
Saya mendapat kesalahan ini hari ini.
Dalam kasus saya, kesalahannya hanyalah kesalahan pengejaan. Kata MAINTENANCE tidak ada, itu N. ketiga
Periksa juga ejaan pada nama file Anda.
sumber
gcc -MT
dan gnu membuat pola dapat mengatasi ini. Lihat juga .../../src/file.c
tetapi sebenarnya itu../../src/folder/file.c
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
Dalam kasus saya, saya menggunakan koma tanpa tulang sebagai pemisah. Untuk menggunakan contoh Anda, saya melakukan ini:
Mengubahnya menjadi setara dengan
memperbaikinya.
sumber
Apakah itu tepat? Ingat bahwa sintaks Makefile adalah spasi putih dan membutuhkan tab untuk membuat indentasi perintah.
sumber
Masalah yang saya temukan bahkan lebih konyol daripada yang disebutkan orang lain.
Makefile kami melewati daftar hal-hal yang harus dibangun. Seseorang ditambahkan
TheOtherLibrary
ke salah satu daftar, seperti yang ditunjukkan di bawah ini.Mereka seharusnya melakukan ini:
Jika mereka melakukannya dengan cara kedua, mereka tidak akan memusnahkan
Library
bangunan. Nilai tambah+=
sangat penting.sumber
Dalam kasus saya itu karena kesalahan aturan multi-line di Makefile. Saya punya sesuatu seperti:
Garis miring terbalik pada akhir daftar file dalam
CONFIG_OBJ1
aturan menyebabkan kesalahan ini. Itu harus seperti:sumber
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:
Sedangkan aku
makefile
terlihat sepertiMeskipun saya memiliki di
index.md
mana seharusnya dan tidak ada kesalahan dalam nama itu, pesan darimake
akanJujur 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
makefile
sedikit, yaitu mengganti pola dengan aturan eksplisit:Dan sekarang pesan yang kita dapatkan adalah:
Keajaiban! Berikut ini dapat disimpulkan:
Pesan
make
tergantung pada aturan dan tidak selalu mengarah ke akar masalahMungkin ada masalah lain di Anda yang
makefile
berbeda dari yang ditentukan oleh pesan iniSekarang kami telah datang dengan gagasan untuk memeriksa dependensi lain dalam suatu aturan juga:
Hanya ini yang akan memberi kami hasil yang diinginkan:
sumber
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
.deps
direktori.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 1
tidak terpengaruh, tetapi butuh beberapa saat untuk menyadari karena saya menggunakan alias (make -j 8
).Untuk membersihkan keadaan, saya menghapus semua
.deps
file dan membuat ulang Makefile. Ini adalah perintah yang saya gunakan:Setelah itu, bangunan kembali berfungsi.
sumber
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
sumber
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.
sumber
Contoh lain dari masalah aneh dan solusinya:
Ini:
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_LIBRARIES
berfungsi:Saya menggunakan clang8 di Mac dan clang 3.9 di Linux Masalahnya hanya terjadi di Linux tetapi berfungsi di Mac!
Saya lupa menyebutkan:
Poco_LIBRARIES
salah - tidak diset oleh cmake / find_package!sumber
Dalam kasus saya, jalan tidak diatur dalam VPATH, setelah menambahkan kesalahan hilang.
sumber
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
sumber
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.
sumber
Dalam kasus saya, itu karena saya memanggil Makefile: MAKEFILE (semua huruf besar)
sumber