makefile
- 作用:进行项目的管理
- makefile的文件名:必须是"makefile"或者“Makeile”
makefile的规则
语法:
目标:依赖条件
(一个tab缩进)命令
- 目标的时间,必须晚于依赖条件的时间,否则,更新目标。
- 依赖条件,如果不存在,寻找新的规则去产生依赖条件
test:test.o add.o sub.o
g++ test.o add.o sub.o -o test
test.o:test.cpp
g++ -c test.cpp -o test.o
add.o:add.cpp
g++ -c add.cpp -o add.o
sub.o:sub.cpp
g++ -c sub.cpp -o sub.o
2个函数
wukdcard函数:
src = $(wildcard ./*.c) :匹配当前目录下所有的.c文件,然后将文件名组成列表,赋值给变量src
patsubst函数:
obj = $(patsubst %.c, %.o, $(src)) :将参3中,包含参1的部分替换为参2.
相当于: obj = add.o sub.o
src = $(wildcard *.cpp)
obj = $(patsubst %.cpp, %.o,$(src))
test:$(obj)
g++ $(obj) -o test
test.o:test.cpp
g++ -c test.cpp -o test.o
add.o:add.cpp
g++ -c add.cpp -o add.o
sub.o:sub.cpp
g++ -c sub.cpp -o sub.o
3个自动变量
普通变量
-
定义变量语法:变量名 = 变量值 (都是字符串)
举例: foo = abc
-
取变量值语法:$(变量)
举例: bar = $(foo) ===> bar=abc
自动变量
- $@:在规则的命令中,表示规则的目标
- $^:在规则的命令中,表示所有依赖条件。
- $<:在规则的命令中,表示第一个依赖条件。在模式规则中,将依赖列表中的每一个依赖依次取出,套用模式规则。
src = $(wildcard *.cpp)
obj = $(patsubst %.cpp, %.o,$(src))
test:$(obj)
g++ $^ -o $@
test.o:test.cpp
g++ -c $< -o $@
add.o:add.cpp
g++ -c $< -o $@
sub.o:sub.cpp
g++ -c $< -o $@
其他关键字
-
ALL:用来给makefile文件,指定“终极目标”。
- makefile文件,默认规则为:自上而下,碰到的第一个规则中的目标就是终极目标。
-
clean:用来借助makefile清除项目中的指定文件,如*.o
-
举例:
clean: # 没有依赖条件 -rm -rf $(obj) a.out
ALL:test src = $(wildcard *.cpp) obj = $(patsubst %.cpp, %.o,$(src)) test:$(obj) g++ $^ -o $@ test.o:test.cpp g++ -c $< -o $@ add.o:add.cpp g++ -c $< -o $@ sub.o:sub.cpp g++ -c $< -o $@ clean: rm -rf $(obj) test
-
模式规则
-
可以将makefile文件中,具有严格统一格式的规则,使用模式规则代替,只能使用$<符号.
%.o:%.cpp g++ -c $< -o $@
-
静态模式规则:
将模式规则,指定给一个变量使用
$(obj):%.o:%.cpp g++ -c $< -o $@xxxxxxxxxx $(obj):%.o:%.cpp g++ -c $< -o $@$(obj):%.o:%.c gcc -c $< -o $@
伪目标
针对,残缺的规则,使之也能生成目标.
.PYTHON:clean ALL
其他参数
-
-n:模拟指定makefile,不真正执行,推荐首次使用makefile使用。
-
-f:指定命名非"makefile"的文件 make -f makefile2
完成版本
target = $(test)
ALL:target
src = $(wildcard *.cpp)
obj = $(patsubst %.cpp, %.o,$(src))
CC = g++
target:$(obj)
$(CC) $^ -o $@
$(obj):%.o:%.cpp
$(CC) -c $< -o $@
clean:
-rm -rf $(obj) target
.PHONY:clean ALL