本文参考文章【C++】make的基础用法 所做的学习笔记
一、makefile三要素
目标,可以是Object File,也可以是可执行文件,还可以是一个标签
依赖,生成 目标 需要的文件或者是另一个目标。可以是多个,也可以没有
命令,make需要执行的命令。可以有多条,一条占一行
基本格式:
[目标]:[依赖]
[命令](命令前面一定是tab键,不能是空格)
二、make工作原理
生成目标 需要—检查—>依赖条件,若有依赖条件则通过命令生成目标;
若没有依赖条件,则需寻找新规则来生成依赖条件(依赖条件为子目标,循环上述步骤,直至生成总目标)。

三、常见的自动化变量解析

.PHONY,makefile的特殊变量。以clean为例,第一种情况,我们不需要生成"clean"这个文件,另一种情况“clean”目标与文件"clean"重名时,目标不会执行。所以我们需要一个"伪目标"去执行makefile中的“clean”下面的命令。
wildcard,用于防止通配符解析失败。使变量定义时,括号里的通配符仍然生效。
patsubst,用于防止替换文件解析失效。替换文件后缀。
四、实战解析
CXX = g++
TARGET = hello
OBJ = main.o printhello.o factorial.o #以上三行为添加变量,用变量代表对应文件
$(TARGET): $(OBJ) #目标:target,依赖:obj。即生成target需要依赖用到obj所包含的文件
$(CXX) -o $(TARGET) $(OBJ) #命令:编译target文件和obj文件
main.o: main.cpp #目标:main.o文件,依赖:main.cpp文件。即生成main.o需要依赖于main.cpp
$(CXX) -c main.cpp #命令:编译main.cpp,可得到main.o
printhello.o: printhello.cpp #目标:printhello.o文件,依赖:printhello.cpp文件。(与上同)
$(CXX) -c printhello.cpp #命令:printhello.cpp,可得到printhello.o
factorial.o: factorial.cpp #目标:factorial.o文件,依赖:factorial.cpp文件。(与上同)
$(CXX) -c factorial.cpp #命令:factorial.cpp,可得到factorial.o
CXX = g++
TARGET = hello
OBJ = main.o printhello.o factorial.o #以上三行为添加变量,用变量代表对应文件
CXXFLAGS = -c -Wall #添加变量,-Wall是打印g++所提示的警告信息
$(TARGET): $(OBJ) #目标:target,依赖:obj。即生成target需要依赖用到obj所包含的文件
$(CXX) -o $@ $^ #命令:编译目标文件target和依赖文件obj。$@表示目标文件,$^表示所有的依赖文件
%.o: %.cpp #将.o和.cpp的同名文件相匹配
$(CXX) $(CXXFLAGS) $< -o $@ #将第一个依赖文件(产生带调试信息的可执行文件)生成目标文件
.PHONY: clean #清除命令
clean:
rm -f *.o $(TARGET) #删除所有.O和目标文件
CXX = g++ #添加变量CXX为编译指令g++
TARGET = hello
SRC = $(wildcard *.cpp) #添加变量SRC为所有的.cpp文件
OBJ = $(patsubst %.cpp, %.o, $(SRC))
#添加变量OBJ。搜寻SRC中文件后,若类型为.cpp或.o则统一替换成patsubst
#以上三行为添加变量,用变量代表对应文件
CXXFLAGS = -c -Wall #添加变量,-Wall是打印g++所提示的警告信息
$(TARGET): $(OBJ) #目标:target,依赖:obj。即生成target需要依赖用到obj所包含的文件
$(CXX) -o $@ $^ #命令:编译目标文件target和依赖文件obj。$@表示目标文件,$^表示所有的依赖文件
%.o: %.cpp #将.o和.cpp的同名文件相匹配
$(CXX) $(CXXFLAGS) $< -o $@ #将第一个依赖文件(产生带调试信息的可执行文件)生成目标文件
.PHONY: clean #清除命令
clean:
rm -f *.o $(TARGET) #删除所有.O和目标文件