Tại sao Makefile?
Việc biên dịch các tệp mã nguồn có thể mệt mỏi, đặc biệt là khi bạn phải bao gồm một số tệp nguồn và gõ lệnh biên dịch mỗi khi bạn cần biên dịch. Makefiles là giải pháp để đơn giản hóa công việc này.
Makefiles là các tệp định dạng đặc biệt giúp xây dựng và quản lý các dự án một cách tự động.
Ví dụ: giả sử chúng ta có các tệp nguồn sau.
- main.cpp
- hello.cpp
- factorial.cpp
- functions.h
main.cpp
Sau đây là mã cho tệp nguồn main.cpp:
#include <iostream>
using namespace std;
#include "functions.h"
int main(){
print_hello();
cout << endl;
cout << "The factorial of 5 is " << factorial(5) << endl;
return 0;
}
hello.cpp
Đoạn mã dưới đây dành cho tệp nguồn hello.cpp -
#include <iostream>
using namespace std;
#include "functions.h"
void print_hello(){
cout << "Hello World!";
}
factorial.cpp
Mã cho factorial.cpp được cung cấp bên dưới:
#include "functions.h"
int factorial(int n){
if(n!=1){
return(n * factorial(n-1));
} else return 1;
}
functions.h
Sau đây là mã cho fnctions.h -
void print_hello();
int factorial(int n);
Cách đơn giản để biên dịch tệp và lấy tệp thực thi là chạy lệnh -
gcc main.cpp hello.cpp factorial.cpp -o hello
Lệnh này tạo ra hello nhị phân. Trong ví dụ này, chúng ta chỉ có bốn tệp và chúng ta biết trình tự của các lệnh gọi hàm. Do đó, có thể gõ lệnh trên và chuẩn bị một tệp nhị phân cuối cùng.
Tuy nhiên, đối với một dự án lớn, nơi chúng ta có hàng nghìn tệp mã nguồn, việc duy trì các bản dựng nhị phân trở nên khó khăn.
Các makelệnh cho phép bạn quản lý các chương trình lớn hoặc nhóm chương trình. Khi bạn bắt đầu viết các chương trình lớn, bạn nhận thấy rằng việc biên dịch lại các chương trình lớn mất nhiều thời gian hơn so với việc biên dịch lại các chương trình ngắn. Hơn nữa, bạn nhận thấy rằng bạn thường chỉ làm việc trên một phần nhỏ của chương trình (chẳng hạn như một chức năng đơn lẻ), và phần lớn chương trình còn lại là không thay đổi.
Trong phần tiếp theo, chúng ta sẽ xem cách chuẩn bị một makefile cho dự án của chúng ta.