Red Hat Training
A Red Hat training course is available for RHEL 8
2.4. 使用 Make 管理更多代码
GNU make 程序(通常缩写为 make)是一个控制从源文件生成可执行文件的工具。make 自动确定复杂程序的哪个部分已更改,需要重新编译。make 使用名为 Makefile 的配置文件来控制构建程序的方式。
2.4.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 详情
makefile 使用相对简单的语法来定义 变量 和 规则,这些变量和规则由一个 target 和一个 recipe 组成。目标指定执行规则后的输出是什么。带有 recipe 的行必须以 TAB 字符开头。
通常,Makefile 包含用于编译源文件的规则、用于链接生成的目标文件的规则,以及充当层次结构顶部的入口点的目标。
请考虑以下用来构建由单个文件 hello.c
组成的 C 程序的 Makefile
。
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 使用变量来概括步骤,并添加一个目标"clean" - 删除除源文件以外的任何内容。
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.1 节 “使用 GCC 构建代码”
2.4.2. Example:使用 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
2.4.3. make
的文档资源
有关 make
的更多信息,请参阅以下列出的资源。
安装的文档
使用
man
和info
工具查看安装在系统上的手册页和信息页:$ man make $ info make
在线文档
- 由自由软件基金会主办的 GNU Make 手册