2.5. 使用 Make 管理更多代码

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

2.5.1. GNU makeMakefile 概述

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

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

先决条件

  • 了解编译和链接的概念

GNU make

GNU make 读取 Makefile,其中包含描述构建过程的说明。Makefile 包含多个 规则,用于描述一种使用特定操作(recipe )满足特定条件(目标)的方法。规则可以分层依赖于另一规则。

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

其他资源

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

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

先决条件

  • 您必须了解 Makefile 的概念并 make

步骤

  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 方法行必须以 tab 字符开头!在文档中复制以上文本时,剪切和粘贴过程可能会粘贴空格而不是制表符(tab)。如果发生这种情况,请手动纠正问题。

  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.5.3. make 文档

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

安装的文档

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

    $ man make
    $ info make

在线文档