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 文件名可以是 MakefilemakefileGNUmakefile 中的一个。默认目标由 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
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.4.2. Example:使用 Makefile 构建一个 C 程序

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

流程

  1. 创建 hellomake 目录:

    $ mkdir hellomake
    Copy to Clipboard Toggle word wrap
  2. 进入 hellomake 目录:

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

    #include <stdio.h>
    
    int main(int argc, char *argv[]) {
      printf("Hello, World!\n");
      return 0;
    }
    Copy to Clipboard Toggle word wrap
  4. 创建包含以下内容的文件 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 行必须以制表符字符开头!从文档中复制上面的文本时,剪切和粘贴过程可能会粘贴空格而不是制表符。如果发生这种情况,请手动纠正问题。

  5. 运行 make

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

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

  6. 运行可执行文件 hello

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

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

2.4.3. make 的文档资源

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

安装的文档

  • 使用 maninfo 工具查看安装在系统上的手册页和信息页:

    1. 查看 make 手册页:

      $ man make
      Copy to Clipboard Toggle word wrap
    2. 查看构建信息页面:

      $ info make
      Copy to Clipboard Toggle word wrap

在线文档

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat