在 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