Saya akan melalui contoh pgm untuk membuat file make.
http://mrbook.org/tutorials/make/
Folder saya eg_make_creation berisi file-file berikut,
desktop:~/eg_make_creation$ ls
factorial.c functions.h hello hello.c main.c Makefile
Makefile
# I am a comment, and I want to say that the variable CC will be
# the compiler to use.
CC=gcc
# Hwy!, I am comment no.2. I want to say that CFLAGS will be the
#options I'll pass to the compiler
CFLAGS=-c -Wall
all:hello
hello:main.o factorial.o hello.o
$(CC) main.o factorial.o hello.o -o hello
main.o:main.c
$(CC) $(CFLAGS) main.c
factorial.o:factorial.c
$(CC) $(CFLAGS) factorial.c
hello.o:hello.c
$(CC) $(CFLAGS) hello.c
clean:
rm -rf *o hello
kesalahan:
desktop:~/eg_make_creation$ make all
make: Nothing to be done for `all'.
Tolong bantu saya memahami untuk menyusun program ini.
hello
up-to-date. Ubahclean
menjadirm -f *.o hello
sebelum melakukan sesuatu yang tidak terduga, lalu jalankanmake clean all
dan lihat apakah itu berhasil..phony: all clean
, karenaall
danclean
bukan nama file.Jawaban:
Terkadang kesalahan "Tidak ada yang bisa dilakukan untuk semua" dapat disebabkan oleh spasi sebelum perintah di aturan makefile, bukan tab. Harap pastikan bahwa Anda menggunakan tab, bukan spasi di dalam aturan Anda.
dari pada
Silakan lihat panduan pembuatan GNU untuk deskripsi sintaks aturan: https://www.gnu.org/software/make/manual/make.html#Rule-Syntax
sumber
all : src/server/mod_wsgi.la
, yang saya ubahall : </t> src/server/mod_wsgi.la
. Saya sekarang mendapatkan kesalahan:make: execvp: src/server/mod_wsgi.la: Permission denied Makefile:29: recipe for target 'all' failed make: *** [all] Error 127
setelahsudo make
. Ada bantuan?Hapus
hello
file dari folder Anda dan coba lagi.The
all
Target tergantung padahello
sasaran. Thehello
target pertama mencoba untuk menemukan yang sesuai file dalam filesystem. Jika ia menemukannya dan diperbarui dengan file dependennya — tidak ada yang bisa dilakukan.sumber
Ketika Anda hanya memberi make, itu membuat aturan pertama dalam makefile Anda, yaitu "semua". Anda telah menentukan bahwa "semua" bergantung pada "halo", yang bergantung pada main.o, factorial.o, dan hello.o. Jadi 'make' mencoba untuk melihat apakah file-file itu ada.
Jika ada, 'make' akan melihat apakah dependensinya, misalnya main.o memiliki dependensi main.c, telah berubah. Jika sudah berubah, buat ulang, jika tidak, lewati aturan. Demikian pula secara rekursif terus membangun file yang telah berubah dan akhirnya menjalankan perintah paling atas, "semua" dalam kasus Anda untuk memberi Anda eksekusi, 'halo' dalam kasus Anda.
Jika mereka tidak hadir, buatlah secara membabi buta membangun segala sesuatu di bawah aturan.
Datang ke masalah Anda, ini bukan kesalahan tetapi 'make' mengatakan bahwa setiap dependensi dalam makefile Anda adalah yang terbaru dan tidak perlu membuat apa pun!
sumber
Make berperilaku dengan benar.
hello
sudah ada dan tidak lebih tua dari.c
file, dan oleh karena itu tidak ada lagi pekerjaan yang harus diselesaikan. Ada empat skenario di mana make perlu membangun (ulang):.c
file Anda , maka itu akan menjadi lebih baru darihello
, dan kemudian harus dibangun kembali ketika Anda menjalankan make.hello
, maka jelas harus membangunnya kembali-B
opsi tersebut.make -B all
make clean all
akan menghapushello
dan membutuhkan pembangunan kembali. (Saya sarankan Anda melihat komentar @ Mat tentangrm -f *.o hello
sumber
Saya pikir Anda melewatkan satu tab di baris ke-9. Baris yang mengikuti semua: halo harus berupa tab kosong. Pastikan Anda memiliki tab kosong di baris ke-9. Ini akan membuat interpreter mengerti bahwa Anda ingin menggunakan resep default untuk makefile.
sumber
Itu bukan kesalahan; perintah make di unix bekerja berdasarkan stempel waktu. Ie katakanlah jika Anda telah membuat perubahan tertentu
factorial.cpp
dan mengkompilasi menggunakanmake
maka make menunjukkan informasi bahwa hanyacc -o factorial.cpp
perintah yang dijalankan. Lain kali jika Anda menjalankan perintah yang sama yaitumake
tanpa membuat perubahan apa pun pada file apa pun dengan.cpp
ekstensi, kompilator mengatakan bahwa file keluaran adalah yang terbaru. Kompilator memberikan informasi ini sampai kita membuat perubahan tertentu pada apapunfile.cpp
.Keuntungan dari
makefile
ini adalah mengurangi waktu kompilasi ulang dengan mengkompilasi hanya file yang dimodifikasi dan dengan menggunakan file object (.o
) dari file yang tidak dimodifikasi secara langsung.sumber
Saya sampai pada kesalahan yang aneh dan sulit di-debug ini melalui rute yang berbeda. Masalah saya akhirnya adalah bahwa saya menggunakan aturan pola dalam langkah membangun ketika target dan ketergantungan berada di direktori yang berbeda. Sesuatu seperti ini:
Saya memiliki beberapa dependensi yang disiapkan dengan cara ini, dan mencoba menggunakan satu resep pola untuk semuanya. Jelas, substitusi tunggal untuk "%" tidak akan berhasil di sini. Saya membuat aturan eksplisit untuk setiap ketergantungan, dan saya menemukan diri saya kembali di antara anak anjing dan unicorn!
Semoga ini bisa membantu seseorang!
sumber