CC=g++
CFLAGS=-c -Wall
LDFLAGS=
SOURCES=main.cpp hello.cpp factorial.cpp
OBJECTS=$(SOURCES:.cpp=.o)
EXECUTABLE=hello
all: $(SOURCES) $(EXECUTABLE)
$(EXECUTABLE): $(OBJECTS)
$(CC) $(LDFLAGS) $(OBJECTS) -o $@
.cpp.o:
$(CC) $(CFLAGS) $< -o $@
Apa yang dilakukan $@
dan $<
dilakukan dengan tepat?
Jawaban:
$@
adalah nama file yang dihasilkan, dan$<
prasyarat pertama (biasanya file sumber). Anda dapat menemukan daftar semua variabel khusus ini di manual GNU Make .Misalnya, perhatikan deklarasi berikut:
Pada kasus ini:
$@
mengevaluasi keall
$<
mengevaluasi kelibrary.cpp
$^
mengevaluasi kelibrary.cpp main.cpp
sumber
$@
tidak selalu harus menjadi file, itu juga bisa menjadi nama.PHONY
target.$@s
untuk menghasilkan output perakitan seperti name.os?The
$@
dan$<
disebut variabel otomatis . Variabel$@
mewakili nama file yang telah dibuat (yaitu target) dan$<
mewakili prasyarat pertama yang diperlukan untuk membuat file output.Sebagai contoh:
Di sini,
hello.o
adalah file output. Inilah yang$@
berkembang. Ketergantungan pertama adalahhello.c
. Itulah yang$<
berkembang.The
-c
flag menghasilkan.o
berkas; lihatman gcc
penjelasan lebih rinci. The-o
menentukan file output untuk membuat.Untuk perincian lebih lanjut, Anda dapat membaca artikel ini tentang Linux Makefiles .
Anda juga dapat memeriksa manual GNU
make
. Ini akan membuatnya lebih mudah untuk membuat Makefiles dan men-debug mereka.Jika Anda menjalankan perintah ini, itu akan menampilkan database makefile:
sumber
$<
akan diperluas kehello.c hello.h
(keduanya). Mohon klarifikasi.$<
hanya item pertama. Untuk memasukkan semua, gunakan$^
.Dari Mengelola Proyek dengan GNU Make, Edisi ke-3, hal. 16 (ini di bawah Lisensi Dokumentasi Bebas GNU ):
sumber
The
$@
dan$<
macro khusus.Dimana:
$@
adalah nama file target.$<
adalah nama ketergantungan pertama.sumber
Makefile membangun
hello
dieksekusi jika salah satu darimain.cpp
,hello.cpp
,factorial.cpp
berubah. Makefile sekecil mungkin untuk mencapai spesifikasi itu adalah:Untuk meningkatkan di atas, kami hanya mengkompilasi file C ++ yang telah diedit. Kemudian, kita hanya menautkan file objek yang dihasilkan bersama.
Untuk memperbaiki ini, kita bisa mengganti semua aturan file objek dengan aturan tunggal
.cpp.o
:Di sini
.cpp.o
aturan mendefinisikan bagaimana membangunanyfile.o
darianyfile.cpp
.$<
cocok dengan ketergantungan pertama, dalam hal ini,anyfile.cpp
$@
cocok dengan target, dalam hal inianyfile.o
,.Perubahan lain yang ada di Makefile adalah:
sumber
sebagai contoh jika Anda ingin mengkompilasi sumber tetapi memiliki objek di direktori yang berbeda:
Yang perlu Anda lakukan:
tetapi dengan sebagian besar makro hasilnya adalah semua objek diikuti oleh semua sumber, seperti:
jadi ini tidak akan mengkompilasi apa pun ^^ dan Anda tidak akan dapat menempatkan file objek Anda di dir yang berbeda :(
solusinya adalah menggunakan macro khusus ini
ini akan menghasilkan file .o (obj / file.o) untuk setiap file .c di SRC (src / file.c)
itu berarti :
tetapi baris demi baris BUKAN semua baris OBJ diikuti oleh semua baris SRC
sumber