make快速入门

场景

顾名思义,make是制作、制造的意思。对于程序员来说,源程序经过编译、汇编和链接会得到可执行程序,这些过程由一系列命令完成,不同的平台使用的命令不同,而且这些过程还会生成各种可能需要删除的中间文件,修改源文件后需要重复这些过程,make定位于自动化构建,根据预定义的规则自动运行命令。针对构建这一业务,引入依赖这个概念,从而实现增量构建,节省编译时间。因此make其实可以理解为一个自动化的脚本,不止用于构建代码,还可以用于latex生成pdf、自动化测试等。

用法

make的核心概念规则,规则由三部分组成:目标、依赖和命令,依赖和命令可以缺一个。

目标可以作为make的参数,当依赖的修改时间比目标的修改时间更新时,就会执行命令。依赖和目标可以是实际的文件,也可以是伪目标,伪目标不是实际的文件,因此每次都会去执行相应的命令,当make没有参数时,会执行第一个。

这些目标都写在Makefile文件中,为了方便书写规则,make提供了通配符、模式匹配及内建变量等,此外还提供隐式规则,Makefile的编写水平决定make的使用水平,autoconf、automake、m4等工具可以辅助Makefile编写,另外Makefile也有各种各样的推荐写法,比较常见的写法是先定义变量,包括编译器、链接命令、源文件列表、目标文件列表等,然后是定义伪目标all、clean、test等,最后再是这些目标的规则。

示例

这里给一个示例,文件结构为

|--Makefile
|--src
|--|--a.cpp
|--|--b.cpp
|--|--c.cpp

make会新建一个build目标,把.o这些中间文件放在这个目录,具体内容为

CC=g++
FLAGS=-Wall
#SRC内容是 src/a.cpp src/b.cpp src/c.cpp
SRC=$(wildcard src/*.cpp)
#patsubst模式替换
#OBJ内容是 build/a.o build/b.o build/c.o
OBJ=$(patsubst src/%.cpp, build/%.o, $(SRC))

.PHONY=all,clean,test

all:main

# $@为目标 @^为所有依赖
main: ${OBJ}
	${CC} -o $@ $^

# @可以关闭命令回显
build/*.o: src/*.cpp
	@mkdir -p build
	${CC} -c -o $@ $^ ${FLAGS}

clean:
	rm -rf build main

test:
	./main
posted @ 2023-05-13 21:05  xiaoweing  阅读(60)  评论(0)    收藏  举报