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
本文来自博客园,作者:xiaoweing,转载请注明原文链接:https://www.cnblogs.com/xiaoweing/p/17397745.html

浙公网安备 33010602011771号