Makefile 指明哪些文件需要先编译,哪些需要后编译,哪些重新编译等等。可以实现“自动化编译”,写好后用make命令(vs: nmake, linux: gnu:make)便可以根据Makefile里的规则实现工程自动编译,能够提高软件开发效率。
makefile规则:
目标...:依赖...
命令 (通过执行命令队医来操作生成目标文件)...
.
规则可以有很多条,但其他规则一般都为第一条服务
app:test.cpp main.cpp
g++ test.cpp main.cpp -o app
以上makefile内容:执行命令 操作test.cpp main.cpp 依赖 生成app目标文件。
执行规则:
1)按顺序执行,如果某条依赖不存在,向下寻找是否有生成该依赖的命令,如果有,执行该规则中的命令。 若下面的规则与第一条没有关系,不执行该无关规则。
2)执行make命令时,会进行检测更新,如果目标文件时间比依赖早,(即依赖被更新)会重新生成目标文件。否则目标不更新,对应规则命令不会重新执行。
app:main.o sub.o add.o
g++ main.o sub.o add.o -o app
sub.o:sub.cpp
gcc -c sub.cpp
add.o:add.cpp
gcc -c add.cpp
main.o:main.cpp
gcc -c main.cpp
效率更高,修改每个文件时只会执行生成对应.o的命令 和最后链接生成可执行程序的命令。
变量
自定义变量:
var=hello (变量名=变量值)
预定义变量:
AR(ar) 归档维护程序的名称 CC(cc) c编译器名称 CXX(g++) C++编译器名称 以下三个只能用在规则命令中
$@:目标完整名称 $< 第一个依赖文件的名称 $^ 所有依赖文件
获取变量值: $(变量名) $(var)
模式匹配
%.o:%.c %通配符,匹配一个字符,此时两个%匹配的是同一个字符
app:main.o sub.o add.o
g++ main.o sub.o add.o -o app
可以写作
app:main.o sub.o add.o
$(CXX) $^ -o $@
模式匹配后可以写作
src=test.o main.o
target=app
$(target):$(src)
$(CXX) $^ -o $@
%.o:%.cpp
$(CC) -c $<
函数
$(wildcard PATTERN) 获取指定目录下指定类型的文件列表 返回值为若干个文件的文件列表
$(wildcard *.cpp *.o)
返回值是: a.cpp b.cpp a.o b.o
%(patsubst <pattern>,<replacement>,<text>) 查找text中符合pattern的,替换为replacement
$(patsubst %.c, %o, x.c bar.c d.cpp)
返回 x.o bar.o
src=$(wildcard *.cpp)
target=app
objs=$(patsubst %.cpp, %.o, $(src))
$(target):$(objs)
$(CXX) $^ -o $@
%.o:%.cpp
$(CC) -c $<
clean 规则 没有依赖 .PHONY表明clean是一个伪目标,不会生成对应目标文件
.PHONY:clean
clean:
rm $(objs) -f
删除所有objs文件。
make 加目标文件 可单独执行该条规则如 make clean