您的位置:首页 > 其它

Makefile .PHONY用法

2017-02-22 14:55 1056 查看
==================================================================================

我的理解:

  拿clean举例,如果make完成后,自己另外定义一个名叫clean的文件,再执行make clean时,将不会执行rm命令。 

  为了避免出现这个问题,需要.PHONY: clean

以上引用自:http://www.cnblogs.com/chenyadong/archive/2011/11/19/2255279.html

==================================================================================

Makefile中非常游泳的三个变量:$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。

1、创建hello.c文件

     #include <stdio.h>

     int main(){

        printf(".PHONY 测试!\n");

     }

2、编写Makefile

   $(CC) = gcc

   all:hello test //hello和test为两目标文件

   hello :hello.c
  $(CC) -o $@ $<

   test :hello.c
  $(CC) -o $@ $<

   clean:
  rm hello

3、执行编译和删除命令(此时可以顺利执行)

   #make 

   #make clean

4、在当前目录下创建clean文件,此时执行make clean

     报log如下,没有执行删除hello操作

     make clean

     make: “clean”是最新的。

5、在Makefile修改如下,此时顺利执行

   $(CC)
= gcc
   .PHONY:clean
   all:hello test 
   hello :hello.c
  $(CC)
-o $@ $<
   test :hello.c
  $(CC)
-o $@ $<
   clean:
  rm
hello   
总结:

      当前目录中没有clean这个文件,输入“make clean”就可以删除hello可执行文件,但在当前目录创建clean文件,再次输入“make clean”,目标被认为是最新的,而不去执行规则所定义的命令。所以rm hello命令不会被执行。为了解决问题,我们将目标clean定义成伪目标。

也就是添加:

.PHONY:clean

那么目录中不论是否有clean文件,只要输入“make clean”就能执行rm命令了。

当一个目标被声明为伪目标后,make在执行规则时不会去试图去查找隐含规则来创建它。这样就提高了make的执行效率,也不用担心由于目标和文件名重名了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: