makefile的规则是make进行处理的依据,它包括了目标文件、依赖文件和它们之间的命令。一般来说,makefile的一个语句就是一个规则,在以前的那个例子中,都显示的指出了makefile的规则关系,如:“$(CC) $(CFLAGS) -c $< -o $@”,但为了简化makefile的书写,makefile包含了隐式规则和模式规则,下面就对这两个规则进行一下阐述:
1.隐式规则
隐式规则可以告诉make如何使用传统的方式完成任务,这样呢,当用户使用它们时就不用详细指定它们编译的具体细节,而只需将目标文件列出就好。make会自动搜索隐式规则目录来确定如何生成目标文件。如前面的例子就可以简写如下:
OBJS = kang.o yul.o
CC = Gcc
CFLAGS = -Wall -O -g
sunq : $(OBJS)
$(CC) $^ -o $@
由于隐式规则的缘故,我们故可以省略后两句。在make的隐式规则中指出:所有的.o文件都可以自动由.c文件按照命令"$(CC) $(CPPFLAGS) $(CFLAGS) -c file.c –o file.o"生成。这样“kang.o”和“yul.o”就会分别调用“$(CC) $(CFLAGS) -c kang.c -o kang.o”和“$(CC) $(CFLAGS) -c yul.c -o yul.o”生成,所以在我们看到好多的makefile就会省略掉后面的几句。
注意:
在隐式规则只能查找到相同文件名的不同后缀名文件,如”kang.o”文件必须由”kang.c”文件生成
下表3.16给出了常见的隐式规则目录:
表3.16 Makefile中常见隐式规则目录
对应语言后缀名 | 规 则 |
C语言:.c变为.o | $(CC) -c $(CPPFLAGS) $(CFLAGS) |
C++语言:.cc或.c变为.o | $(CXX) -c $(CPPFLAGS) $(CXXFLAGS) |
Pascal编译:.p变为.o | $(PC)-c $(PFLAGS) |
Fortran编译:.r变为-o | $(PC)-c $(FFLAGS) |
2.模式规则
模式规则是用来定义相同处理规则的多个文件的。不同于隐式规则,隐式规则仅仅能够用make默认的变量进行处理,而模式规则还可以引入用户自定义变量,为多个文件建立相同的规则,从而简化makefile的书写。
模式规则的格式类似于普通规则,该规则的相关文件必须用“%”注明,使用模式规则修改后的makefile如下:
CFLAGS = Wall -o -g
CC = Gcc
OBJS =kang.o yul.o
sunq:$(OBJS)
$(CC) -c $^ -o $@
%.o:%.c
$(CC) $(CFLAGS)-c $< -o $@