Makefile基本使用

用途

  • 项目代码编译管理
  • 节省编译项目时间
  • 一次编写终身受益

基本规则

基本原则

  1. 若想生成目标,检查规则中的依赖条件是否存在,如不存在,则寻找是否有规则用来生成依赖文件
  2. 检查规则中的目标是否需要更新,必须先检查它的所有依赖,依赖中有任一被更新,则目标必须更新

规则

1
2
目标:依赖条件
(注意需要tab缩进)命令
  • ALL变量用于指定makefile的最终目标

示例:

1
2
3
4
5
ALL:test   -->用于指定终极目标,当最终目标不在第一组规则的时候使用
test:test.cpp wrap.cpp
g++ test.cpp wrap.cpp -o test

#在当前工作目录输入make编译会生成test目标

Makefile变量

自动变量:

  • $@表示规则中的目标
  • $<表示规则中的第一个依赖条件,在模式规则中,它可以将依赖条件列表中的所有依赖依次取出,套用模式规则
  • $^表示规则中的所有依赖条件,组成一个列表,以空格隔开,如果这个列表中有重复的项则消除重复项

注:自动变量是使用于规则的命令中

Makefile函数

函数

  • src=$(wildcard *.cpp)找到当前目录下所有后缀为.cpp的文件,赋值给src,wildcard为函数名,$()是函数调用方式,*.cpp是参数
  • obj=$(patsubst %.cpp,%.o,$(src))把src变量里所有后缀为.cpp的文件替换成.o,patsubst为函数名,$()是函数调用方式,%.cpp为替换前的文件后缀,%.o为替换后的文件后缀

模式规则

模式规则

  • 使用模式匹配来自动化帮我们实现手写规则
  • 例如:我要将.cpp文件生成.o文件就可以写成这样:
1
2
%.o:%.cpp
g++ -c $< -o $@

静态模式规则就是指定模式规则给谁用

例如:

1
2
3
$(obj):%.o:%.cpp
g++ -c $< -o $@
#这个就是将%.o:%.cpp这个规则给$(obj)使用

clean

使用

  • 可以在makefile中定义clean来清理编译后不需要的文件
  • 在终端使用make clean命令执行

规则

1
2
clean:
命令

示例

1
2
3
clean:
-rm -rf *.o
#删除当前目录下的所有.o后缀文件

注:rm前的-表示忽略出错执行,也就是当删除一个文件出错时,会忽略这个错误继续执行后面的操作

生成伪目标

  • 伪目标不管条件满足与否,目标都要被执行
  • 当我们有一个名字为clean文件或者ALL的文件,这样会导致make出错,因此我们需要生成伪目标
1
.PHONY:clean ALL

最终模板

模板1:用于指定文件执行,比方单个文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
cxx=g++
target=test #命名自己定义
obj=test.o wrap.o

arg=-c -Wall

$(target):$(obj)
$(cxx) $^ -o $@

%.o:%.cpp
$(cxx) $(arg) $< -o $@

.PHONY:clean ALL
clean:
-rm -rf $(obj) $(target)

模板2:适用于项目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
cxx=g++
target=test
src=$(wildcard *.cpp)
obj=$(patsubst %.cpp,%.o,$(src))

arg=-c -Wall

$(target):$(obj)
$(cxx) $^ -o $@

%.o:%.cpp
$(cxx) $(arg) $< -o $@

.PHONY:clean ALL
clean:
-rm -rf $(obj) $(target)

Makefile基本使用
https://moonfordream.github.io/posts/Makefile基本使用/
作者
Moon
发布于
2024年5月19日
许可协议