Makefile基本使用

Makefile基本使用

用途

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

基本规则

基本原则

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

规则

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

示例:

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文件就可以写成这样:
%.o:%.cpp
	g++ -c $< -o $@

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

例如:

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

clean

使用

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

规则

clean:
	命令

示例

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

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

生成伪目标

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

最终模板

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

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:适用于项目

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)

尾言

我的博客中还有很多笔记欢迎大家进行访问哦
地址1:codebooks.xyz
地址2:moonfordream.github.io

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Moon2144

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值