Makefile membangun hello
dieksekusi jika salah satu dari main.cpp
, hello.cpp
, factorial.cpp
berubah. Makefile sekecil mungkin untuk mencapai spesifikasi itu adalah:
hello: main.cpp hello.cpp factorial.cpp
g++ -o hello main.cpp hello.cpp factorial.cpp
- pro: sangat mudah dibaca
- con: maintenance nightmare, duplikasi dependensi C ++
- con: masalah efisiensi, kami mengkompilasi ulang semua C ++ walaupun hanya satu yang diubah
Untuk meningkatkan di atas, kami hanya mengkompilasi file C ++ yang telah diedit. Kemudian, kita hanya menautkan file objek yang dihasilkan bersama.
OBJECTS=main.o hello.o factorial.o
hello: $(OBJECTS)
g++ -o hello $(OBJECTS)
main.o: main.cpp
g++ -c main.cpp
hello.o: hello.cpp
g++ -c hello.cpp
factorial.o: factorial.cpp
g++ -c factorial.cpp
- pro: memperbaiki masalah efisiensi
- con: mimpi buruk pemeliharaan baru, kesalahan ketik potensial pada aturan file objek
Untuk memperbaiki ini, kita bisa mengganti semua aturan file objek dengan aturan tunggal .cpp.o
:
OBJECTS=main.o hello.o factorial.o
hello: $(OBJECTS)
g++ -o hello $(OBJECTS)
.cpp.o:
g++ -c $< -o $@
- pro: kembali ke makefile pendek, agak mudah dibaca
Di sini .cpp.o
aturan mendefinisikan bagaimana membangun anyfile.o
dari anyfile.cpp
.
$<
cocok dengan ketergantungan pertama, dalam hal ini, anyfile.cpp
$@
cocok dengan target, dalam hal ini anyfile.o
,.
Perubahan lain yang ada di Makefile adalah:
- Mempermudah untuk mengubah kompiler dari g ++ ke kompiler C ++.
- Mempermudah untuk mengubah opsi kompiler.
- Mempermudah untuk mengubah opsi tautan.
- Sehingga lebih mudah untuk mengubah file sumber C ++ dan output.
- Menambahkan aturan default 'semua' yang bertindak sebagai pemeriksaan cepat untuk memastikan semua file sumber Anda ada sebelum upaya untuk membangun aplikasi Anda dibuat.