Skip to content

make工具与Makefile 更新ing

make工具

make是一个构建自动化工具,主要用于管理和自动化编译过程。
make工具通过读取一个名为 Makefile 的文件,执行其中定义的规则和命令,以生成目标文件(如可执行文件、库文件等)。

一、作用

  1. 自动化构建:通过定义规则和依赖关系,自动化编译、链接和生成可执行文件的过程。
  2. 增量构建:只重新编译和链接发生变化的文件,提高构建效率。
  3. 可维护性:通过使用变量和规则,简化构建过程的管理和维护。
  4. 跨平台构建:通过定义不同平台的编译选项和命令,实现跨平台构建。

二、使用

  1. 在包含 Makefile 的目录中运行 make 命令:
    bash
    make
  2. 清理 make 生成的文件:
    bash
    make clean

三、基本原理

通过读取 Makefile 文件,解析其中的规则和依赖关系,决定哪些文件需要重新生成。它基于文件的时间戳来判断文件是否需要更新。如果依赖文件比目标文件新,则重新生成目标文件。

通过执行make命令,会选择Makefile文件中第一个出现的目标作为默认目标。如果你没有在命令行中指定目标,会构建这个默认目标。

Makefile文件

一、Makefile规则基本结构

makefile
target: dependencies
    command   # 先输出命令command,再执行command命令
    @command  # 不输出命令command,直接执行command命令
  • target: 要生成的目标文件
  • dependencies: 生成目标文件所依赖的文件
  • command: 生成目标文件的命令

二、变量与伪目标

1.定义

  • 变量:用于简化和复用代码。例如,CC 变量指定编译器,CFLAGS 变量指定编译选项。
  • 伪目标:用于定义不生成实际文件的目标,如 clean。伪目标通常使用 .PHONY 声明。
makefile
PARAM = param
TARGET = myprogram
makefile
.PHONY: all 
all: proto build
makefile
# 变量定义
CC = gcc
CFLAGS = -Wall -g
SRCS = main.c utils.c
OBJS = main.o utils.o
TARGET = myprogram

# 规则
$(TARGET): $(OBJS)
	$(CC) $(CFLAGS) -o $(TARGET) $(OBJS)

main.o: main.c
	$(CC) $(CFLAGS) -c main.c

utils.o: utils.c
	$(CC) $(CFLAGS) -c utils.c

# 伪目标
.PHONY: clean
clean:
	rm -f $(OBJS) $(TARGET)

2.使用变量值

$(...)代表取变量的值,$还有一些特殊用法

  1. $^: 表示所有的依赖文件
  2. $@: 表示生成的目标文件
  3. $<: 表示第一个依赖文件

3.变量赋值

makefile
VIR_A = A
VIR_B = $(VIR_A) B
VIR_A = AA            # VIR_A的值:AA, VIR_B的值:AA B
makefile
VIR_A := A
VIR_B := $(VIR_A) B
VIR_A := AA           # VIR_A的值:AA, BIR_B的值:A B
makefile
VIR_A = A
VIR_B = $(VIR_A) B
VIR_A ?= AA           # VIR_A的值:A, BIR_B的值:A B

三、其他指令

  1. $(MAKE): MAKE为特殊变量,为当前的 make 命令
  2. .SUFFIXES: 特殊目标,用于定义文件后缀的规则,将其设置为空,可以避免默认的后缀规则干扰自定义规则。