Makefile的语法和函数
一、Makefile的语法
本节我们只是简单的讲解Makefile的语法,如果想比较深入
学习Makefile的话可以:
- a. 百度搜 “gnu make 于凤昌”。
- b. 查看官方文档: http://www.gnu.org/software/make/manual/
1.1 通配符
假如一个目标文件所依赖的依赖文件很多,那样岂不是我们要写很多规则,这显然是不合乎常理的
我们可以使用通配符,来解决这些问题。
我们对上节程序进行修改代码如下:
test: a.o b.o
gcc -o test $^
%.o : %.c
gcc -c -o $@ $<
%.o:表示所用的.o文件
%.c:表示所有的.c文件
$@:表示目标
$<:表示第1个依赖文件
$^:表示所有依赖文件
我们来在该目录下增加一个 c.c 文件,代码如下:
#include <stdio.h>
void func_c()
{
printf("This is C\n");
}
然后在main函数中调用修改Makefile,修改后的代码如下:
test: a.o b.o c.o
gcc -o test $^
%.o : %.c
gcc -c -o $@ $<
执行
make
结果
gcc -c -o a.o a.c
gcc -c -o b.o b.c
gcc -c -o c.o c.c
gcc -o test a.o b.o c.o
运行
./test
结果
This is B
This is C
1.2 假想目标: .PHONY
1.我们想清除文件,我们在Makefile的结尾添加如下代码就可以了:
clean:
rm *.o test
*1)执行 make :生成第一个可执行文件。
*2)执行 make clean : 清除所有文件,即执行: rm *.o test。
make后面可以带上目标名,也可以不带,如果不带目标名的话它就想生成第一个规则里面的第一个目标。
2.使用Makefile
执行:make [目标] 也可以不跟目标名,若无目标默认第一个目标。我们直接执行make的时候,会在makefile里面找到第一个目标然后执行下面的指令生成第一个目标。当我们执行 make clean 的时候,就会在 Makefile 里面找到 clean 这个目标,然后执行里面的命令,这个写法有些问题,原因是我们的目录里面没有 clean 这个文件,这个规则执行的条件成立,他就会执行下面的命令来删除文件。
如果:该目录下面有名为clean文件怎么办呢?
我们在该目录下创建一个名为 “clean” 的文件,然后重新执行:make,然后make clean,结果(会有下面的提示:):
clean:
make: \`clean' is up to date.
它根本没有执行我们的删除操作,这是为什么呢?
我们之前说,一个规则能过执行的条件:
*1)目标文件不存在
*2)依赖文件比目标新
现在我们的目录里面有名为“clean”的文件,目标文件是有的,并且没有依赖文件,没有办法判断依赖文件的时间。