在 C++ 中使用 Makefile

Jinku Hu 2021年4月29日
在 C++ 中使用 Makefile

本文將演示如何在 C++ 中使用 Makefile 的多種方法。

使用 Makefile 在 C++ 中輕鬆編譯多檔案程式

Makefile 是描述程式原始檔和要編譯的標頭檔案之間的關係的檔名。該檔案由在命令列上呼叫的 make 實用程式使用,它充當程式碼專案的微型構建系統。但是請注意,make 不僅限於程式語言,甚至不限於程式編譯,因為它可以用於需要基於對相對檔案所做的修改來更新檔案的場景中。這些關係由描述特定操作的一組規則表示。以下程式碼段顯示了典型規則的結構。目標通常是可執行檔案或目標檔案的名稱。前提條件通常是輸出目標檔案所需要的輸入檔案。recipe 是由 make 執行的操作,它們在每一個新行上用 Tab 縮排。注意,make 會掃描名為 makefileMakefile 的檔案,如果該檔案存在於當前工作目錄中。

target: prerequisites
	recipe

規則是 Makefile 的主要部分,因為它們是唯一必要的部分。下面的示例演示了簡單的 Makefile 結構,該結構可構建名為 program 的可執行檔案。現在,program 具有前提條件-main.olibrary1.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
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

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