注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

小可尼の博客

Linux后端的技术窝窝

 
 
 

日志

 
 

伪目标.PHONY  

2013-12-26 16:06:01|  分类: Makefile的编写 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

出处:http://blog.csdn.net/qq575787460/article/details/8778682

 

这次只有一个main.cpp和一个Makefile文件。

main.cpp


[cpp] view plaincopyprint?
#include <iostream>   
using namespace std;  
  
int main()  
{  
    cout<<"hello world!"<<endl;  
    return 0;  
}  

#include <iostream>
using namespace std;

int main()
{
	cout<<"hello world!"<<endl;
	return 0;
}


Makefile


[plain] view plaincopyprint?
main:main.o  
    g++ -o main main.o  
main.o:main.cpp  
    g++ -c -o main.o main.cpp  

main:main.o
	g++ -o main main.o
main.o:main.cpp
	g++ -c -o main.o main.cpp

执行make之后,目录内多出来了2个文件main.o和main,我们需要的是main,而main.o只是一个中间文件,对于我们来说并不需要,可以删除掉。

我们可以把Makefile这样写:


[plain] view plaincopyprint?
main:main.o  
    g++ -o main main.o  
main.o:main.cpp  
    g++ -c -o main.o main.cpp  
clean:  
    rm *.o  

main:main.o
	g++ -o main main.o
main.o:main.cpp
	g++ -c -o main.o main.cpp
clean:
	rm *.o

增加了一条规则,目标文件为clean,由于没有依赖的文件,也就是目标文件永远是新的,所以这条规则不会主动执行。

为了执行这条规则,我们可以这样make clean,这样就可以删除所有的.o结尾的文件。

但是当目录内没有.o结尾的文件时,这条命令将会报错,并停止往下执行。

我们把Makefile修改成这样,做个试验:


[plain] view plaincopyprint?
main:main.o  
    g++ -o main main.o  
main.o:main.cpp  
    g++ -c -o main.o main.cpp  
clean:  
    rm *.o  
    echo "clean obj"  

main:main.o
	g++ -o main main.o
main.o:main.cpp
	g++ -c -o main.o main.cpp
clean:
	rm *.o
	echo "clean obj"

删除成功之后,将会输出clean obj。

多次执行make clean,当目录内已经没有.o结尾的文件时,将会出现下面的错误。


[plain] view plaincopyprint?
rm *.o  
rm: cannot remove `*.o': No such file or directory  
make: *** [clean] Error 1  

rm *.o
rm: cannot remove `*.o': No such file or directory
make: *** [clean] Error 1

并且也没有往下执行输出clean obj,但是我们关心的不是删除的成功或失败,我们关心的是保证不存在.o结尾的文件。

但是这个Makefile中,如果不存在.o文件,竟然会报错,并且终止执行,shit。

我们可以做如下修改:


[plain] view plaincopyprint?
main:main.o  
    g++ -o main main.o  
main.o:main.cpp  
    g++ -c -o main.o main.cpp  
clean:  
    -rm *.o  

main:main.o
	g++ -o main main.o
main.o:main.cpp
	g++ -c -o main.o main.cpp
clean:
	-rm *.o

也就是在rm的前面加一个减号,这样即使目录内没有.o文件,也会继续往下执行。只不过还是会有出错提示。


[plain] view plaincopyprint?
rm *.o  
rm: cannot remove `*.o': No such file or directory  
make: [clean] Error 1 (ignored)  
echo "clean obj"  
clean obj  

rm *.o
rm: cannot remove `*.o': No such file or directory
make: [clean] Error 1 (ignored)
echo "clean obj"
clean obj

看到这一坨出错提示,感觉很不爽,我们在修改Makefile,如下:


[plain] view plaincopyprint?
main:main.o  
    g++ -o main main.o  
main.o:main.cpp  
    g++ -c -o main.o main.cpp  
clean:  
    -rm -f *.o  
    echo "clean obj"  

main:main.o
	g++ -o main main.o
main.o:main.cpp
	g++ -c -o main.o main.cpp
clean:
	-rm -f *.o
	echo "clean obj"

即在-rm和*.o之间添加-f,这样无论我们执行多少次make clean,输出结果都是:


[plain] view plaincopyprint?
rm -f *.o  
echo "clean obj"  
clean obj  

rm -f *.o
echo "clean obj"
clean obj


 

但是,不要以为这样就万事OK了,我们在目录内添加一个文件,文件名为clean。

我们再执行make clean,结果竟然是:


[plain] view plaincopyprint?
make: `clean' is up to date.  

make: `clean' is up to date.

由于目标clean文件没有依赖文件,并且clean文件已经存在了,所以clean这个目标文件永远是最新的,我们在clean中写的东东也永远不会执行。

怎么办,可以通过Makefile的关键字.PHONY,它显式声明一个目标文件是伪目标,执行该伪目标时,make并不关心该目标文件是否存在,只管执行。


[plain] view plaincopyprint?
main:main.o  
    g++ -o main main.o  
main.o:main.cpp  
    g++ -c -o main.o main.cpp  
.PHONY:clean  
clean:  
    -rm -f *.o  
    echo "clean obj"  

main:main.o
	g++ -o main main.o
main.o:main.cpp
	g++ -c -o main.o main.cpp
.PHONY:clean
clean:
	-rm -f *.o
	echo "clean obj"

这样,不管clean文件是否存在,make clean的时候,clean目标中的命令都会执行。

不管.o文件是否存在,make clean的时候,都不会报错。

  评论这张
 
阅读(147)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018