在 C++ 中使用 Makefile
本文將演示如何在 C++ 中使用 Makefile 的多種方法。
使用 Makefile 在 C++ 中輕鬆編譯多檔案程式
Makefile
是描述程式原始檔和要編譯的標頭檔案之間的關係的檔名。該檔案由在命令列上呼叫的 make
實用程式使用,它充當程式碼專案的微型構建系統。但是請注意,make
不僅限於程式語言,甚至不限於程式編譯,因為它可以用於需要基於對相對檔案所做的修改來更新檔案的場景中。這些關係由描述特定操作的一組規則表示。以下程式碼段顯示了典型規則的結構。目標通常是可執行檔案或目標檔案的名稱。前提條件通常是輸出目標檔案所需要的輸入檔案。recipe
是由 make
執行的操作,它們在每一個新行上用 Tab 縮排。注意,make
會掃描名為 makefile
或 Makefile
的檔案,如果該檔案存在於當前工作目錄中。
target: prerequisites
recipe
規則是 Makefile
的主要部分,因為它們是唯一必要的部分。下面的示例演示了簡單的 Makefile
結構,該結構可構建名為 program
的可執行檔案。現在,program
具有前提條件-main.o
和 library1.o
,它們是從以下規則輸出的目標檔案。兩者都有各自的配方,可以編譯某些先決條件以獲得給定的輸出。請注意,g++
命令是 GNU C++ 編譯器,它作為配方的一部分執行,並且可以使用常規的命令列引數進行構造。
program : main.o library1.o
g++ -o program main.o library1.o
main.o : main.cpp header1.h
g++ -c main.cpp
library1.o : library1.cpp library1.h
g++ -c library1.cpp
Makefile
的另一個特點是變數,其行為類似於 C++ 預處理程式巨集表示式。即,我們可以為多次出現在檔案中的字串定義名稱別名,並放置變數名稱。例如,下一個程式碼段顯示了在檔案開頭定義的 OBJ
變數,其中包括在第一個規則中重複的程式
先決條件。但是請注意,當替換更長的字串時,變數是最有效的。
OBJ = main.o library1.o
program : $(OBJ)
g++ -o program $(OBJ)
main.o : main.cpp header1.h
g++ -c main.cpp
library1.o : library1.cpp library1.h
g++ -c library1.cpp
另外,我們可以定義其他變數,這些變數可以表示編譯器或連結器標誌,通常在 Makefile
中的多個位置使用。因此,當專案很大並且 Makefile
變得更大時,修改單行比更改給定引數的每個例項都容易。
OBJ = main.o library1.o
CC = g++
LFLAGS = -lm
program : $(OBJ)
$(CC) -o $(LFLAGS) program $(OBJ)
main.o : main.cpp header1.h
$(CC) -c main.cpp
library1.o : library1.cpp library1.h
$(CC) -c library1.cpp
Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.
LinkedIn