Menu Close
Red Hat Training
A Red Hat training course is available for RHEL 8
第 5 章 使用 Make 管理更多代码
GNU make 工具程序(通常缩写 )是 控制源文件生成的可执行文件的工具。自动 决定复杂程序的哪些部分已更改,需要重新编译。使用 名为 Makefiles 的配置文件来控制程序构建的方式。
5.1. GNU make
和 Makefile
概述
要从特定项目的源文件中创建可用的表单(通常可执行文件),请执行几个必要的步骤。记录操作及其序列以便稍后重复它们。
Red Hat Enterprise Linux 包含 GNU make
,这是为此设计的一个构建系统。
先决条件
- 了解编译和连接的概念
GNU make
GNU make
读取包含构建过程说明的 Makefile。Makefile 包含多个 规则,它们描述了通过特定操作(recipe)满足特定条件(target)的方法。规则可分层依赖于另一个规则。
在没有选项的情况下运行 make
会导致它在当前目录中查找 Makefile,并尝试访问默认目标。实际的 Makefile 文件名可以是 Makefile
、makefile
和 GNUmakefile
之一。默认目标由 Makefile 内容决定。
Makefile details
makefile 使用相对简单的语法来定义 变量 和 规则,这些变量和规则由一个 target 和一个 recipe 组成。如果某个规则被执行,目标指定了输出。使用 Reipes 的行必须以 TAB 字符开头。
通常, Makefile 包含编译源文件的规则、用于链接结果对象文件的规则以及作为层次结构顶部入口点的目标。
考虑以下 Makefile
以构建由单个文件 hello.c
组成的 C 程序。
all: hello hello: hello.o gcc hello.o -o hello hello.o: hello.c gcc -c hello.c -o hello.o
本例显示要达到目标 all
,需要文件 hello
。要获得 hello
,一个需要 hello.o
(由 gcc
链接),它从 hello.c
创建(由 gcc
编译)。
目标 all
是默认目标,因为它是第一个以一段时间(.)开头的目标。当当前目录包含这个 Makefile
时,在没有参数的情况下运行 make
与运行 make all
相同。
典型的 makefile
一个更典型的 Makefile 使用变量来常规化步骤,并添加一个目标"干净" - 除源文件外,删除所有内容。
CC=gcc CFLAGS=-c -Wall SOURCE=hello.c OBJ=$(SOURCE:.c=.o) EXE=hello all: $(SOURCE) $(EXE) $(EXE): $(OBJ) $(CC) $(OBJ) -o $@ %.o: %.c $(CC) $(CFLAGS) $< -o $@ clean: rm -rf $(OBJ) $(EXE)
在这样的 Makefile 中添加更多源文件只需要将其添加到定义了 SOURCE 变量的行中。
其它资源
- GNU make: 简介 - 2 一个 Makefile 简介
- 第 2 章 使用 GCC 构建代码
5.2. 示例:使用 Makefile 构建 C 程序
按照本例中的步骤使用 Makefile 构建示例 C 程序。
流程
创建目录
hellomake
并改为此目录:$ mkdir hellomake $ cd hellomake
创建包含以下内容的
hello.c
文件:#include <stdio.h> int main(int argc, char *argv[]) { printf("Hello, World!\n"); return 0; }
创建包含以下内容的
Makefile
文件:CC=gcc CFLAGS=-c -Wall SOURCE=hello.c OBJ=$(SOURCE:.c=.o) EXE=hello all: $(SOURCE) $(EXE) $(EXE): $(OBJ) $(CC) $(OBJ) -o $@ %.o: %.c $(CC) $(CFLAGS) $< -o $@ clean: rm -rf $(OBJ) $(EXE)
小心Makefile recipe 行必须以标签字符开头!从文档中复制上述文本时,横线过程可能会粘贴空格而不是标签页。如果发生了这种情况,请手动修正这个问题。
运行
make
:$ make gcc -c -Wall hello.c -o hello.o gcc hello.o -o hello
这会创建一个可执行文件
hello
。运行可执行文件
hello
:$ ./hello Hello, World!
运行 Makefile 目标
clean
删除创建的文件:$ make clean rm -rf hello.o hello
5.3. 文档资源 make
有关 make
的详情请参考以下列出的资源。
安装的文档
使用
man
和info
工具查看系统中安装的手动页面和信息页面:$ man make $ info make
在线文档
- GNU Make Manual 由 Free Software Foundation 托管
- Red Hat Developer Toolset User Guide - 第 3 章。GNU make