05makefile学习之两个函数和一个特殊规则clean
以下为相关makefile的学习文章
01makefile学习之GCC编译的四个阶段(带编译阶段、汇编阶段、-S,-c的区别)
02makefile学习之makefile的基本原则
03makefile学习之makefile的一个规则
04makefile学习之多个规则处理多个文件
05makefile学习之两个函数和一个特殊规则clean
06makefile学习之三个自动变量(@ , @,@,^,$<)和模式规则
07makefile学习之习题1
08makefile学习之习题2
前言
上一篇我们讲完多个规则编译多个程序并解决没有改动就不需要重新编译的问题。接下来讲到如何使用makefile的函数帮我们匹配对应的文件名。
1 两个函数
在makefile文件中,所以变量都是字符串的形式,所以使得我们在使用变量时不需要定义变量类型,可以直接赋值即可。下面两个函数也的参数也同理。
1)src = $(wildcard ./*.c)//实际上该函数可以认为是一个变量,里面为函数名wildcard和一个目录路径参数,代表匹配当前目录路径的所有.c文件,返回返回给src。
2)obj = $(patsubst %.c %.o $(src)) //patsubst函数代表:将src返回的值中,含有参数1".c"后缀的文件名全部换成".o"后缀。即后缀的替换。
那么上一篇的程序经过这两个函数替换后就变成了以下内容(对比上一篇):
先给上一篇makefile:
hello:hello.o add.o sub.o mul.o
gcc hello.o add.o sub.o mul.o -o hello
hello.o:hello.c
gcc -c hello.c -o hello.o
add.o:add.c
gcc -c add.c -o add.o
sub.o:sub.c
gcc -c sub.c -o sub.o
mul.o:mul.c
gcc -c mul.c -o mul.o
替换后:
src = $(wildcard ./*.c) #src=helloc.c,add.c,sub.c,mul.c
obj = $(patsubst %.c,%.o,$(src)) #"%"表示匹配一个或者多个文件,参数之间是逗号分隔
ALL:hello
hello:$(obj)
gcc $(obj) -o hello
hello.o:hello.c
gcc -c hello.c -o hello.o
add.o:add.c
gcc -c add.c -o add.o
sub.o:sub.c
gcc -c sub.c -o sub.o
mul.o:mul.c
gcc -c mul.c -o mul.o
2 一个特殊的规则clean
clean规则的作用:在生成可执行文件过程中,删除产生不必要的文件(例如.o文件)。
其中删除规则在命令的实现中有一个横线"-":代表删除出错时不报错。
clean:
-rm -rf $(obj) #注意前面第一个"-"的作用
所以我们加上clean规则后如下:
src = $(wildcard ./*.c)
obj = $(patsubst %.c,%.o,$(src)) #param bewteen is ","
ALL:hello
hello:$(obj)
gcc $(obj) -o hello
hello.o:hello.c
gcc -c hello.c -o hello.o
add.o:add.c
gcc -c add.c -o add.o
sub.o:sub.c
gcc -c sub.c -o sub.o
mul.o:mul.c
gcc -c mul.c -o mul.o
clean:
-rm -rf $(obj)
但是即使在makefile文件中增加了该行规则,它是不会帮你自动删除的,需要你收到敲命令删除,但为了删除文件错误,一般都会先敲测试命令表示模拟删除并不会真正删除,程序员比较结果正确后就正式删除,步骤如下:
//以下是在终端敲命令
//1 先模拟删除
make clean -n
//2 正确后正式删除
make clean
结果如下: