2.5. 使用 Make 管理更多代码
GNU make 程序(通常缩写为 make)是一个控制从源文件生成可执行文件的工具。make 自动确定复杂程序的哪个部分已更改,需要重新编译。make 使用名为 Makefile 的配置文件来控制构建程序的方式。
2.5.1. GNU make
和 Makefile
概述
要从特定项目的源文件创建可用格式(通常是可执行文件),请执行几个必要的步骤。记录操作及其序列以便以后重复它们。
Red Hat Enterprise Linux 包含 GNU make
,它是一个专为此目的而设计的构建系统。
先决条件
- 了解编译和链接的概念
GNU make
GNU make
读取 Makefile,其中包含描述构建过程的说明。Makefile 包含多个 规则,用于描述一种使用特定操作(recipe )满足特定条件(目标)的方法。规则可以分层依赖于另一规则。
在不带任何选项的情况下运行 make
,它会在当前目录中查找 Makefile,并尝试访问默认目标。实际 Makefile 文件名可以是 Makefile
、makefile
和 GNUmakefile
之一。默认目标从 Makefile 内容确定。
Makefile 详情
makefile 使用相对简单的语法来定义 变量 和 规则,这些变量和规则由一个 target 和一个 recipe 组成。目标指定规则执行时的输出是什么。配方(recipes)的行必须以 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 使用变量对步骤进行规范化,并添加目标"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.5.2. 例如:使用 Makefile 构建 C 程序
按照本例中的步骤,使用 Makefile 构建示例 C 程序。
先决条件
-
您必须了解 Makefile 的概念并
make
。
步骤
创建
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 方法行必须以 tab 字符开头!在文档中复制以上文本时,剪切和粘贴过程可能会粘贴空格而不是制表符(tab)。如果发生这种情况,请手动纠正问题。
运行
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.5.3. make
文档
有关 make
的详情请参考以下列出的资源。
安装的文档
使用
man
和info
工具查看系统中安装的 man page 和信息页面:$ man make $ info make
在线文档
- GNU Make Manual 由自由软件基金会托管