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)的某一条件(target)的方法。规则可以在层次上依赖于另一条规则。

运行不带任何选项的 make 可使其在当前的目录中查找 Makefile ,并尝试到达默认目标。实际的 Makefile 文件名可以是 MakefilemakefileGNUmakefile 中的一个。默认目标由 Makefile 内容决定。

使用特定目标运行 make

$ make target
Copy to Clipboard Toggle word wrap
Makefile 结构和语法
makefile 使用相对简单的语法来定义 变量规则,这些变量和规则由一个 target 和一个 recipe 组成。目标指定执行规则后的输出是什么。带有 recipe 的行必须以 TAB 字符开头。

通常,Makefile 包含用于编译源文件的规则、用于链接生成的目标文件的规则,以及充当层次结构顶部的入口点的目标。

基本 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
Copy to Clipboard Toggle word wrap

本例演示了要到达目标 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)
Copy to Clipboard Toggle word wrap

向此类 Makefile 添加更多源文件只需要将它们添加到定义了 SOURCE 变量的行中。

2.5.2. 示例:使用 Makefile 构建 C 程序

按照本示例中的步骤,使用 Makefile 构建一个示例 C 程序。

步骤

  1. 创建一个 hellomake 目录,并进到此目录:

    $ mkdir hellomake
    $ cd hellomake
    Copy to Clipboard Toggle word wrap
  2. 创建包含以下内容的文件 hello.c

    #include <stdio.h>
    
    int main(int argc, char *argv[]) {
      printf("Hello, World!\n");
      return 0;
    }
    Copy to Clipboard Toggle word wrap
  3. 创建包含以下内容的文件 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)
    Copy to Clipboard Toggle word wrap
    重要

    Makefile recipe 行必须以制表符字符开头!从文档中复制上面的文本时,剪切和粘贴过程可能会粘贴空格而不是制表符。如果发生这种情况,请手动纠正问题。

  4. 运行 make

    $ make
    gcc -c -Wall hello.c -o hello.o
    gcc hello.o -o hello
    Copy to Clipboard Toggle word wrap

    这将创建一个可执行文件 hello

  5. 运行可执行文件 hello

    $ ./hello
    Hello, World!
    Copy to Clipboard Toggle word wrap
  6. 运行 Makefile 目标 clean 以删除创建的文件:

    $ make clean
    rm -rf hello.o hello
    Copy to Clipboard Toggle word wrap

2.5.3. make 文档

有关 make 的更多信息,请参阅以下列出的资源。

安装的文档
  • 使用 maninfo 工具查看安装在系统上的手册页和信息页:
$ man make
$ info make
Copy to Clipboard Toggle word wrap
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat