Các Makefile xây dựng các hello
thực thi nếu có một trong những main.cpp
, hello.cpp
, factorial.cpp
thay đổi. Makefile nhỏ nhất có thể để đạt được đặc tả đó có thể là:
hello: main.cpp hello.cpp factorial.cpp
g++ -o hello main.cpp hello.cpp factorial.cpp
- pro: rất dễ đọc
- con: cơn ác mộng duy trì, sự trùng lặp của các phụ thuộc C ++
- con: vấn đề hiệu quả, chúng tôi biên dịch lại tất cả C ++ ngay cả khi chỉ có một thay đổi
Để cải thiện vấn đề trên, chúng tôi chỉ biên dịch các tệp C ++ đã được chỉnh sửa. Sau đó, chúng tôi chỉ liên kết các tệp đối tượng kết quả với nhau.
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: khắc phục vấn đề hiệu quả
- con: cơn ác mộng bảo trì mới, lỗi đánh máy tiềm năng trên các quy tắc tệp đối tượng
Để cải thiện điều này, chúng ta có thể thay thế tất cả các quy tắc tệp đối tượng bằng một .cpp.o
quy tắc duy nhất :
OBJECTS=main.o hello.o factorial.o
hello: $(OBJECTS)
g++ -o hello $(OBJECTS)
.cpp.o:
g++ -c $< -o $@
- pro: trở lại với một makefile ngắn, hơi dễ đọc
Ở đây .cpp.o
quy tắc xác định làm thế nào để xây dựng anyfile.o
từ anyfile.cpp
.
$<
phù hợp với sự phụ thuộc đầu tiên, trong trường hợp này, anyfile.cpp
$@
phù hợp với mục tiêu, trong trường hợp này , anyfile.o
.
Những thay đổi khác có trong Makefile là:
- Giúp dễ dàng thay đổi trình biên dịch từ g ++ sang bất kỳ trình biên dịch C ++ nào.
- Làm cho nó dễ dàng hơn để thay đổi các tùy chọn trình biên dịch.
- Làm cho nó dễ dàng hơn để thay đổi các tùy chọn liên kết.
- Làm cho nó dễ dàng hơn để thay đổi các tệp nguồn và đầu ra C ++.
- Đã thêm quy tắc mặc định 'tất cả' hoạt động như một kiểm tra nhanh để đảm bảo tất cả các tệp nguồn của bạn đều có mặt trước khi nỗ lực xây dựng ứng dụng của bạn được thực hiện.