Menu Close

Red Hat Training

A Red Hat training course is available for RHEL 8

第 5 章 使用 Make 管理更多代码

GNU make 工具程序(通常缩写 )是 控制源文件生成的可执行文件的工具。自动 决定复杂程序的哪些部分已更改,需要重新编译。使用 名为 Makefiles 的配置文件来控制程序构建的方式。

5.1. GNU makeMakefile 概述

要从特定项目的源文件中创建可用的表单(通常可执行文件),请执行几个必要的步骤。记录操作及其序列以便稍后重复它们。

Red Hat Enterprise Linux 包含 GNU make,这是为此设计的一个构建系统。

先决条件

  • 了解编译和连接的概念

GNU make

GNU make 读取包含构建过程说明的 Makefile。Makefile 包含多个 规则,它们描述了通过特定操作(recipe)满足特定条件(target)的方法。规则可分层依赖于另一个规则。

在没有选项的情况下运行 make 会导致它在当前目录中查找 Makefile,并尝试访问默认目标。实际的 Makefile 文件名可以是 MakefilemakefileGNUmakefile 之一。默认目标由 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 变量的行中。

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

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

流程

  1. 创建目录 hellomake 并改为此目录:

    $ mkdir hellomake
    $ cd hellomake
  2. 创建包含以下内容的 hello.c 文件:

    #include <stdio.h>
    
    int main(int argc, char *argv[]) {
      printf("Hello, World!\n");
      return 0;
    }
  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)
    小心

    Makefile recipe 行必须以标签字符开头!从文档中复制上述文本时,横线过程可能会粘贴空格而不是标签页。如果发生了这种情况,请手动修正这个问题。

  4. 运行 make:

    $ make
    gcc -c -Wall hello.c -o hello.o
    gcc hello.o -o hello

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

  5. 运行可执行文件 hello:

    $ ./hello
    Hello, World!
  6. 运行 Makefile 目标 clean 删除创建的文件:

    $ make clean
    rm -rf hello.o hello

5.3. 文档资源 make

有关 make 的详情请参考以下列出的资源。

安装的文档

  • 使用 maninfo 工具查看系统中安装的手动页面和信息页面:

    $ man make
    $ info make

在线文档