makefile学习
makefile好处:一次编写,终身受益。
makefile命名规则:
- makefile
- Makefile
makefile三要素
- 目标
- 依赖
- 规则命令
写法
目标:依赖
tab键 规则命令
第一版makefile
app:main.cpp src/*.cpp
g++ -o app -I ./include main.cpp src/*.cpp
如果更改其中一个文件,所有的源码都重新进行编译。
考虑分解编译过程,先生成.o文件.o文件变成结果。
第二版makefile
ObjDiv = ./src/div.cpp
ObjAdd = ./src/add.cpp
ObjMul = ./src/mul.cpp
ObjSub = ./src/sub.cpp
ObjFiles = main.o div.o add.o mul.o sub.o
app:$(ObjFiles)
g++ -o app -I ./include $(ObjFiles)
main.o:main.cpp
g++ -c main.cpp -I ./include
div.o:$(ObjDiv)
g++ -c $(ObjDiv) -I ./include
add.o:$(ObjAdd)
g++ -c $(ObjAdd) -I ./include
mul.o:$(ObjMul)
g++ -c $(ObjMul) -I ./include
sub.o:$(ObjSub)
g++ -c $(ObjSub) -I ./include
注意:makefile默认处理第一个目标d’d’d’d
函数
wildcard : 可以进行查找
patsubst : 可以进行内容替换
变量
$@ 代表目标
$^ 代表全部依赖
$< 第一个依赖
$? 第一个变化的依赖
@不显示命令
-命令错继续往下执行
第三版makefile
# get all .cpp files
SrcFiles=$(wildcard *.cpp ./src/*.cpp)
# all .c files -> .o file
ObjFiles = $(patsubst %.cpp,%.o,$(SrcFiles))
app:$(ObjFiles)
g++ -o app -I ./include $(ObjFiles)
# 模式匹配规则$< $@ 只能规则中出现
%.o:%.cpp
g++ -c $< -I ./include -o $@
# 加上@不显示命令 -出错继续执行
clean:
-@rm -f app
@rm -f $(ObjFiles)
test:
@echo $(SrcFiles)
@echo $(ObjFiles)
最终版本
## 匹配所有.cpp文件
CppFile = $(wildcard *.cpp ./src/*.cpp)
## 替换.cpp 为.o
ObjFile = $(patsubst %.cpp, %.o, $(CppFile))
## 头文件路径
HeadFile = ./include
all:app
app:$(ObjFile)
g++ -o $@ -I $(HeadFile) $(ObjFile)
%.o:%.cpp
g++ -c -o $@ -I $(HeadFile) $<
clean:
-@rm -rf app
@rm -rf $(ObjFile)
## 定义伪目标
.PHONY:clean all