
本文共 1469 字,大约阅读时间需要 4 分钟。
隐含规则是Makefile中的核心机制,它允许Make根据预定义的规则自动处理目标文件的编译与生成。在使用.makefile时,如果目标文件依赖于其他文件的隐式生成,Make会利用其内部预定义的隐含规则来自动推导生成这些文件的命令。这是一种非常强大的功能,可以简化Makefile的编写和维护。
以下是关于隐含规则的一些核心内容和实际应用案例:
1. 编译C/C++程序的隐含规则
隐式规则默认将源文件名如.c
、.cc
或.C
扩展为对应的目标文件如.o
或.a
。Make会自动推导出这些目标文件的生成规则:
%.o: %.c
或%.o: %.cc
- 默认编译命令是
$(CC) -c $(CFLAGS) $(CPPFLAGS)
- 例如,将
hello.c
编译为hello.o
的命令会被Make自动生成:$(CC) -c $(CFLAGS) $(CPPFLAGS) hello.c -o hello.o
2. 编译C++程序的隐含规则
隐式规则还支持多种源文件类型:
%.o: %.cc
%.o: %.C
- 默认编译命令是
$(CXX) -c $(CFLAGS) $(CPPFLAGS)
3. Pascal程序的隐含规则
对于Pascal语言,默认规则如下:
%.o: %.p
- 默认编译命令是
$(PC) -c $(PFLAGS)
4. 链接Object文件
隐式规则支持从多个.o
文件生成最终的可执行程序或图来(.a
文件)。默认链接规则:
$(CC) $(LDFLAGS) -o $(LOADLIBES) $(LDLIBS) -l
- 例如,链接多个
.o
文件生成main.a
的命令会是:$(CC) -o main a.o b.o c.o
5. 内建隐葛规则的变量
隐式规则中使用了许多预定义的变量,可以通过自定义这些变量来定制规则:
- 编译器和工具:
CC
: C编译器(默认cc
)CXX
: C++编译器(默认g++
)PC
: Pascal编译器(默认pc
)
- 编译标志:
CFLAGS
CPPFLAGS
PFLAGS
FFLAGS
LDFLAGS
6. 模式规则
隐式规则可以通过模式规则定义为更灵活的形式。例如:
%.o: %.c $(CC) -c $(CFLAGS) $(CPPFLAGS) $<
这里,$%
表示目标文件名的字头部分,$<
表示依赖文件的名字。如果源文件是foo.c
,目标文件会自动定为foo.o
。
7. 中间目标与隐含规则链
隐式规则还能处理复杂的依赖关系,比如通过先运行Yacc生成C源文件,再编译生成Object文件。Make会自动处理中间目标文件,只有在最终目标可生成时才会保留中间文件。
8. 重载内建隐距规则
开发者可以重写内建规则,定义专门的编译方式:
%.obj: %.c $(CC) -g -O $(CFLAGS) $< -o $@
这会生成带有调试和优化的目标文件。
9. 后缀规则(兼容性考虑)
后缀规则是一种旧式隐式规则定义方式,它支持类似.c.o: .c
的双后缀规则。这种方式不如模式规则灵活,但可以保证与旧版Make兼容。
10. 利用自动化变量
在隐式规则中,$@
、$<
等自动化变量可以帮助脚本化文件操作:
%.dvi: %.texi $(TEXI2DVI) $< -o $@
这里,$<
表示输入文件,$@
表示输出文件。
###Closure通过合理使用隐式规则和自定义变量,可以大大提升Makefile的编写效率和代码的可维护性。理解和正确应用隐式规则是每个Makefile开发者必须掌握的核心技能。
发表评论
最新留言
关于作者
