1.make
- gcc - 编译器
- make - Linux自带的构建器
- 构建的规则在makefile中
2.makefile 文件的命名
-makefile
-Makefile
3.makefile 中的规则
gcc a.c b.c c.c -o app
- 三部分: 目标 ,依赖,命令
- 目标:依赖
(tab缩进)命令
- app:a.c b.c c.c
gcc a.c b.c c.c -o app
- makefile中由一条或多条规则组成
4.makefile 的编写
第一个版本:
app:main.cpp add.cpp max.cpp
g++ main.cpp add.cpp max.cpp -I ./header/ -o app
缺点:效率低,修改一个文件,所有文件全部会被重新编译
第二个版本:
- 工作原理:
- 检查文件是否存在:
- 向下搜索下边的规则,如果有规则生成查找的依赖的,执行规则中的命令
- 依赖存在,判断是否需要更新
- 检查文件是否存在:
app:main.o add.o max.o
g++ main.o add.o max.o -o app
main.o:main.cpp
g++ main.cpp -c -I ./header/
add.o:add.cpp
g++ add.cpp -c -I./header/
max.o:max.cpp
g++ max.cpp -c -I./header/
缺点:冗余
第三个版本:
- 自定义变量:obj = a.o b.o c.o
- 变量的取值: aa=$(obj)
- makefile自带的变量:大写
- ·CPPFLAGS
- CC
- 自动变量:
- $@: 规则中的目标
- $<:规则中的第一个依赖
- $^:规则中所有的依赖
- 只能在规则的命令中使用
obj=main.o add.o max.o
target=app
$(target):$(obj)
g++ $(obj) -o $(target)
%.o:%.c
g++ -c $< -o $@
模式匹配:
%.o:%.c
第一次:main.o没有
main.o:main.cpp
g++ -c main.cpp -o main.o
第一次:add.o没有
add.o:add.cpp
g++ -c add.cpp -o add.o
1 obj=main.o add.o max.o
2 target=app
3 $(target):$(obj)
4 g++ $^ -o $@
5 %.o:%.c
6 g++ -c $< -o $@
7
8
9 clean:
10 rm *.o
11
第四个版本:
- makefile 所有的的函数都有返回值
- 查找指定目录下指定类型的文件
- src =$(wildcard ./*.cpp)
- 匹配替换
- obj=$(patsubst %.cpp,%.o,$(src))
1 src=$(wildcard ./*.cpp)
2 obj=$(patsubst %.cpp,%.o,$(src))
3 target=app
4 $(target):$(obj)
5 g++ $^ -o $@
6 %.o:%.c
7 g++ -c $< -o $@
8 clean:
9 rm *.o
make clean
- 编写一个清理项目的规则
clean:
rm *.o app
- 命令前加 ‘ - ’ 忽略执行失败,表示执行失败,继续往下执行。
- 声明伪目标:(防止受文件中clean文件影响)
.PHONY:clean
1 src=$(wildcard ./*.cpp)
2 obj=$(patsubst %.cpp,%.o,$(src))
3 target=app
4 $(target):$(obj)
5 g++ $^ -o $@
6 %.o:%.c
7 g++ -c $< -o $@
8
9 .PHONY:clean
10 clean:
11 rm $(obj) $(target) -f
12 hello:
13 cho "hello world"
- 让make生成不是终极目标的目标
- make 目标名
.
├── header
│ ├── add.h
│ └── max.h
├── makefile
└── src
├── add.cpp
├── main.cpp
└── max.cpp
1 src=$(wildcard $(SRC_PATH)*.cpp)
2 obj=$(patsubst %.cpp,%.o,$(src))
3
4
5 TOP_PATH = $(shell pwd)
6 SRC_PATH = $(TOP_PATH)/src/
7 INC_PATH = $(TOP_PATH)/header/
8
9 target=app
10
11 $(target):$(obj)
12 g++ $^ -o $@
13 %.o:%.cpp
14 g++ -c $< -o $@ -I$(INC_PATH)
15
16
17
18
19 .PHONY:clean
20 clean:
21 -rm $(obj) $(target) -f