Makefile 指南

Make 是一个自动化构建工具,最初由 Stuart Feldman 在 1977 年开发。它通过读取名为 Makefile 的文件来确定如何编译和链接程序。Makefile 包含了一系列的规则,定义了目标文件、依赖关系和构建命令。

1
2
3
4
5
6
P=program_name
OBJECTS=
CFLAGS = -g -Wall -O3
LDLIBS=
CC=c99
$(P): $(OBJECTS)

基本概念

  • 目标(Target) :Makefile 中要生成的文件,通常是可执行文件或对象文件。
  • 依赖(Dependency) :目标文件生成所需的源文件或其他目标文件。
  • 命令(Command) :生成目标文件所需执行的命令,通常是编译或链接命令。
  • 变量(Variable) :用于存储常用的值,如编译器选项、文件列表等,便于维护和修改。
  • 模式规则(Pattern Rule) :定义了一种通用的规则,可以应用于多个目标文件,使用通配符表示。
  • 伪目标(Phony Target) :不对应实际文件的目标,通常用于执行特定任务,如清理临时文件。
  • 自动变量(Automatic Variable) :在规则的命令中使用的特殊变量,如 $@ (目标文件名)、 $< (第一个依赖文件名)等。

    1
    2
    3
    4
    
    # $@ = target name
    # $* = target name without suffix
    # $< = target dependence
    $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $*.c

高级特性

  • 并行构建(Parallel Build) :Make 支持并行执行多个任务,通过 `-j` 选项指定并行任务数,提高构建速度。
  • 调试(Debugging) :Make 提供了一些选项,如 `–debug`,用于调试 Makefile 的执行过程,帮助定位问题。
  • 内置规则(Built-in Rules) :Make 自带了一些默认的规则,可以自动处理常见的文件类型,如 .c.o 的编译。当 GNU Make 判断你需要通过目标文件来生成可执行程序时,它会采用以下规则:

    1
    
    $(CC) $(LDFLAGS) first.o second.o $(LDLIBS)

    查看 make 默认规则可以使用下面的命令:

    1
    
    make -p > default_rules
  • 后缀规则(Suffix Rule) :一种特殊的模式规则,基于文件后缀名定义转换规则,如 .c.o
  • 命令行选项(Command Line Options) :Make 提供了多种命令行选项,如 -f 指定 Makefile 文件, -n 仅显示将要执行的命令等。
  • 错误处理(Error Handling) :Make 在执行命令时,如果遇到错误,默认会停止执行,可以通过 -k 选项继续执行其他任务。