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

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.


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.


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.


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.


11

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


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.


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
...

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

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.


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


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.


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!


0

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


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


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.


-1

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.