Trang tài liệu
Khóa học C++ nền tảng
Chương 17. Hệ thống xây dựng
Makefile

Makefile

Makefile là một tệp cấu hình được sử dụng bởi tiện ích make để tự động hóa quá trình biên dịch và liên kết mã code trong một dự án C++. Nó bao gồm một tập hợp các quy tắc và phần phụ thuộc giúp xây dựng tệp thực thi đích hoặc thư viện từ các tệp mã nguồn.

Makefiles giúp các nhà phát triển tiết kiệm thời gian, giảm lỗi và đảm bảo tính nhất quán trong quá trình xây dựng. Họ đạt được điều này bằng cách chỉ định các phụ thuộc giữa các tệp nguồn khác nhau và cung cấp các lệnh tạo tệp đầu ra (chẳng hạn như tệp đối tượng và tệp thực thi) từ tệp đầu vào (chẳng hạn như mã nguồn và tiêu đề).

Cấu trúc của một Makefile

Một Makefile điển hình có cấu trúc như sau:

  • Biến: Xác định các biến để lưu trữ các giá trị thường được sử dụng, chẳng hạn như cờ trình biên dịch, thư mục hoặc tên đích.
  • Quy tắc: Xác định cách tạo tệp đầu ra từ tệp đầu vào bằng cách sử dụng một bộ lệnh. Mỗi quy tắc có một đích, một tập hợp các điều kiện tiên quyết và một công thức.
  • Các đích giả: Các đích không đại diện cho các tệp thực tế trong dự án nhưng phục vụ như một cách để nhóm các quy tắc có liên quan và gọi chúng bằng một lệnh duy nhất.

Ví dụ

Hãy xem xét một dự án C++ cơ bản với cấu trúc thư mục sau:

project/
|-- include/
|   |-- header.h
|-- src/
|   |-- main.cpp
|-- Makefile

Một Makefile đơn giản cho dự án này có thể như sau:

# Variables
CXX = g++
CXXFLAGS = -Wall -Iinclude
SRC = src/main.cpp
OBJ = main.o
EXE = my_program
 
# Rules
$(EXE): $(OBJ)
	$(CXX) $(CXXFLAGS) -o $(EXE) $(OBJ)
 
$(OBJ): $(SRC)
	$(CXX) $(CXXFLAGS) -c $(SRC)
 
# Phony targets
.PHONY: clean
clean:
	rm -f $(OBJ) $(EXE)

Với Makefile này, bạn chỉ cần chạy make trong terminal để xây dựng dự án và make clean để xóa các tệp đầu ra. Makefile chỉ định các phụ thuộc giữa mã nguồn, tệp đối tượng và tệp thực thi cuối cùng, cũng như các lệnh để biên dịch và liên kết chúng.

Tóm tắt

Makefiles cung cấp một cách hiệu quả để tự động hóa việc xây dựng các dự án C++ bằng cách sử dụng tiện ích make. Chúng mô tả các phụ thuộc và lệnh cần thiết để tạo tệp đầu ra từ mã nguồn, tiết kiệm thời gian và đảm bảo tính nhất quán trong quá trình xây dựng.