📜  单个 cpp 文件的 makefile - C++ (1)

📅  最后修改于: 2023-12-03 15:22:48.780000             🧑  作者: Mango

单个 CPP 文件的 Makefile - C++

如果您正在编写 C++ 程序并且代码只存在于一个 CPP 文件中,那么可以使用 Makefile 管理和构建您的项目。Makefile 是一种自动化构建工具,用于管理代码和编译项目。在本教程中,我们将介绍如何创建适用于单个 CPP 文件的简单 Makefile。

基本格式

Makefile 由多个规则组成,每个规则表示一个构建步骤。一个基本 Makefile 包含以下几个部分:

target: dependencies
    command
  • Target:目标是指要构建的文件或任务的名称。可以是二进制文件、库文件或任何其他文件类型的名称。
  • Dependencies:依赖关系表示目标依赖哪些文件。如果这些文件不存在或已更改,则需要重新构建目标。
  • Command:命令是指如何生成目标文件的指令序列。

举个例子,我们有一个名为 "hello.cpp" 的 C++ 文件,我们希望将其编译成一个可执行文件 "hello"。我们可以创建如下的 Makefile:

hello: hello.cpp
    g++ hello.cpp -o hello

在这个例子中,我们声明一个名为 "hello" 的目标。这个目标依赖于 "hello.cpp" 文件。命令是告诉 Makefile 如何生成目标文件的指令。在这个例子中,我们使用 g++ 编译器将 "hello.cpp" 文件编译成可执行文件 "hello"。

变量

在 Makefile 中,我们可以定义变量来存储常用的值,如编译器名称、编译选项等。

例如,我们可以添加一个变量来存储编译器名称:

CC=g++

然后我们可以在命令行中使用这个变量:

hello: hello.cpp
    $(CC) hello.cpp -o hello
命令

命令是指 Makefile 中的每个规则所需执行的指令序列。这可以是一个或多个命令,每个命令可以是 shell 命令、管道命令、输入/输出重定向命令等。

在 Makefile 中,每个命令必须以 Tab 缩进开头。如果使用空格代替 Tab,Makefile 将无法正常工作。

在下面的示例中,我们将使用一个命令来将所有 .cpp 文件编译成一个可执行文件:

CC=g++
CFLAGS=-Wall -Wextra -Wpedantic

SRC=$(wildcard *.cpp)
OBJ=$(SRC:.cpp=.o)

program: $(OBJ)
    $(CC) $(CFLAGS) -o $@ $^

%.o: %.cpp
    $(CC) $(CFLAGS) -c $< -o $@

这个 Makefile 包含两个规则。第一个规则使用变量和通配符从源文件 (.cpp) 中构建所有目标文件 (.o)。第二个规则编译目标文件并将其链接到可执行文件中。

自动推导规则

在 Makefile 中,我们可以使用自动推导规则来自动推导目标文件和依赖关系。这种方法可以使 Makefile 更加简洁并减少代码冗余。

CC=g++
CFLAGS=-Wall -Wextra -Wpedantic

SRC=$(wildcard *.cpp)

program: $(SRC:.cpp=.o)
    $(CC) $(CFLAGS) -o $@ $^

%.o: %.cpp
    $(CC) $(CFLAGS) -c $<

使用这种方法,Makefile 将自动推导目标文件和依赖关系,从而生成相应的代码来构建项目。

结论

在本教程中,我们介绍了如何创建适用于单个 CPP 文件的 Makefile。我们了解了基本的 Makefile 语法、变量和命令,并学习了如何使用自动推导规则使 Makefile 更加简洁和易于维护。根据您的需要,您可以扩展 Makefile 来处理更复杂的项目。