美文网首页C编程系列
【C编程系列】Makefile中.PHONY的使用

【C编程系列】Makefile中.PHONY的使用

作者: 苹果小王子写字的地方 | 来源:发表于2018-06-08 09:53 被阅读38次

    在C项目构建中,经常在Makefile文件中用到.PHONY配置项。.PHONY配置项的主要作用在于避免指定命令和项目下的同名文件冲突,进行性能优化。.PHONY [command name] 显式指定了一个命令名称【而不是实际文件名】,是为了避免该命令名称与makefile同路径下的文件名重名冲突,以使make [command name]命令可以正确被解析、执行。下面将举例说明。

    例 1

    如果编写一个规则名称为clean,不产生目标文件,那么该命令在执行make clean时规则都会被执行,makefile内容如下:

    clean:
        rm -f *.o temp
    

    rm 命令不产生任何clean文件。

    • 如果目录下不存在名为"clean"的文件,则运行make clean时,命令都会正常执行;
    • 如果目录下存在名为"clean"的文件,则运行make clean时,命令规则会失效,文件"clean"没有依赖文件,始终是最新的,make clean永远不会被执行。
      为了解决上述问题,可以使用.PHONY clean指明该clean命令。如下:
    .PHONY clean
    
    clean:
        rm -f *.o temp
    

    这样执行命令make clean会自动忽略名为"clean"文件的存在。已知.PHONY配置项的目标并不是其他文件生成的实际文件,make命令会自动绕过隐含规则搜索过程,因此声明.PHONY配置项会改善性能,bi且不需要担心实际同名文件存在与否。

    例 2

    如果.PHONY目标有依赖关系。当一个目录中存在多个可运行程序,将其配置在同一个makefile文件。由于make [command name/ Default command]默认缺省规则是makefile文件中的第一个规则,一般将这第一个规则称为"all",其依赖文件为多个可运行程序,如下:

    all:  p1 p2 p3
    .PHONY: all
    p1:  p1.o utils.o
           cc -o p1 p1.o utils.o
    p2:  p2.o utils.o
           cc -o p2 p2.o utils.o
    p3:  p3.o utils.o
           cc -o p3 p3.o utils.o
    

    其中p1、p2和p3是三个可执行文件,make把"all"作为主要规则,每次执行时都尝试把"all"更新,因此会检查其依赖文件p1、p2和p3是否需要更新,如果需要,就把它们更新,从而达到我们的目的。通过.PHONY指定目标为all,可以避免目录下同名文件的干扰,即不用检查规则"all"是否有同名文件存在,也不需要查询任何隐含规则,直接假定指定的规则"all"需要被更新。


    综上所述,.PHONY是一个伪目标,可以有效防止在Makefile文件中定义的可执行命令的目标规则和工作目录下的实际文件出现名称冲突,并提高了执行Makefile的性能。


    Bob Huang
    2018.0608

    相关文章

      网友评论

        本文标题:【C编程系列】Makefile中.PHONY的使用

        本文链接:https://www.haomeiwen.com/subject/prsosftx.html