在 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