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 makeMakefile 概述

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

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

本例演示了要到达目标 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 变量的行中。

2.4.2. Example:使用 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

2.4.3. make 的文档资源

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

安装的文档

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

    $ man make
    $ info make

在线文档