Makefile--隐含规则
发布日期:2021-05-24 22:26:48 浏览次数:22 分类:精选文章

本文共 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开发者必须掌握的核心技能。

上一篇:Makefile--使用make更新函数库文件
下一篇:Makefile--Make运行

发表评论

最新留言

逛到本站,mark一下
[***.202.152.39]2025年05月03日 00时40分59秒