博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Makefile伪目标
阅读量:7231 次
发布时间:2019-06-29

本文共 1585 字,大约阅读时间需要 5 分钟。

一、.PHONY : clean

每个Makefile中都应该写一个清空目标文件(.o和执行文件)的规则,这不仅便于重编译,

也很利于保持文件的清洁。这是一个“修养”(呵呵,还记得我的《编程修养》吗)。一般
的风格都是:
clean:
  rm edit $(objects)
更为稳健的做法是:
.PHONY : clean
clean :
  -rm edit $(objects)

 

前面说过,.PHONY意思表示clean是一个“伪目标”,。而在rm命令前面加了一个小减号

的意思就是,也许某些文件出现问题,但不要管,继续做后面的事。当然,clean的规则不要
放在文件的开头,不然,这就会变成make的默认目标,相信谁也不愿意这样。不成文的规矩
是——“clean从来都是放在文件的最后”。

 

二、all

请编写一个makefile同时编译、链接下面两个程序:

 

//main1.c:#include
int main(void){ printf("main1\n");}//main2.c:#include
int main(void){ printf("main2\n");}

 

 

  这里需要生成两个可执行文件main1main2(两个目标)。

  由于makefile只能有一个目标,所以可以构造一个没有规则的终极目标all,并以这两个可执行文件作为依赖。

如下:

 

makefile:all:main1 main2main1: main1.c    @gcc main1.c -o main1main2: main2.c    @gcc main2.c -o main2

 

很多时候我们在执行make时会产生许多过程文件,比如将上面的makefile改为:

 

makefile:all:main1 main2main1: main1.c    @gcc main1.c -o main1main2: main2.o    @gcc main2.o -o main2main2.o: main2.c    @gcc -c main2.c

 

这样就会生成一个我们不需要的过程文件main2.o

如果希望将生成的过程文件删掉,根据前面再增加一个目标clean

 

all:main1 main2 cleanmain1: main1.c    @gcc main1.c -o main1main2: main2.o    @gcc main2.o -o main2main2.o: main2.c    @gcc -c main2.c clean:    @rm -f main2.o

 

但是当我们make之后main2.o仍然存在,怎么回事呢

原来这里的目标clean没有任何依赖,make执行时认为这已经到根上了(就是认为磁盘上有clean,就像main2.c,将其忽略(尽管它有规则)。

关键字.PHONY可以解决这问题,告诉make该目标是假的(磁盘上其实没有clean),这时make为生成这个目标就会将其规则执行一次。.PHONY修饰的目标就是只有规则没有依赖。

加上一句.PHONYclean即可:

 

all:main1 main2 cleanmain1: main1.c    @gcc main1.c -o main1main2: main2.o    @gcc main2.o -o main2main2.o: main2.c    @gcc -c main2.c .PHONY:cleanclean:    @rm -f main2.o

 

 

 

 

转载于:https://www.cnblogs.com/ztteng/articles/3172631.html

你可能感兴趣的文章
学习 - SpringMVC
查看>>
logic标签用法
查看>>
MFC中自定义消息
查看>>
hdu 5258 wyh2000 and pupil(dfs)
查看>>
新安装的ubuntu编辑器问题
查看>>
SOJ - 11598
查看>>
[WC2005]双面棋盘(并查集+分治)
查看>>
C#中利用WebBrowser控件,获得HTML源码
查看>>
Android中通过反射获取资源Id
查看>>
Ubuntu Desktop基本办公环境搭建
查看>>
opensuse 13.1 中如何使用yong中文输入法
查看>>
c++堆栈区别
查看>>
HDU 4272 LianLianKan [状态压缩DP]
查看>>
Windows恢复分区管控命令reagentc
查看>>
Ruby操作数据库基本步骤
查看>>
pom.xml介绍
查看>>
浏览器的同源策略和跨域问题
查看>>
Python lambda函数
查看>>
模块与包以及自定义模块
查看>>
ANGULAR $HTTP请求
查看>>