首页 > 代码库 > 5.22上午 外教 linux 听力812

5.22上午 外教 linux 听力812

技术分享

技术分享

 

技术分享

 

Makefile那些稀奇古怪的符号

这些稀奇古怪的符号是前面隐式规则中出现过,单独拎出来是因为我们会经常用到它们。         

 

这些符号也就是我们常说的自动变量:

 

$@ :规则中的目标集

 

$^ :规则中的所有先决条件

 

$< :表示规则中的第一个先决条件

 

 

 

再来说说$VAR$$VAR的区别:

 

makefile文件中的规则绝大部分都是使用shell命令来实现的,这里就涉及到了变量的使用,包括makefile中的变量和shell命令范畴内的变量。在makefile的规则命令行中使用$var就是在命令中引用makefile的变量,这里仅仅是读取makefile的变量然后扩展开,将其值作为参数传给了一个shell命令;而$$var是在访问一个shell命令内定义的变量,而非makefile的变量。如果某规则有nshell命令行构成,而相互之间没有用‘;‘‘\‘连接起来的话,就是相互之间没有关联的shell命令,相互之间也不能变量共享。

 

 

 

Makefile之伪目标

使用其原因一:避免和同名文件冲突

 

在现实中难免存在所定义的目标与所存在的目标是同名的,采用Makefile如何处理这种情况呢?Makefile中的假目标(phony target)可以解决这个问题。

 

假目标可以使用.PHONY关键字进行声明,对于假目标,可以想象,因为不依赖于某文件,make该目标的时候,其所在规则的命令都会被执行。

 

        

 

如果编写一个规则,并不产生目标文件,则其命令在每次make 该目标时都执行。

 

例如:

 

clean:

 

rm *.o temp

 

因为"rm"命令并不产生"clean"文件,则每次执行"make clean"的时候,该命令都会执行。如果目录中出现了"clean"文件,则规则失效了:没有依赖文件,文件"clean"始终是最新的,命令永远不会执行;为避免这个问题,可使用".PHONY"指明该目标。如:

 

.PHONY : clean

 

这样执行"make clean"会无视"clean"文件存在与否。

 

 

 

已知phony 目标并非是由其它文件生成的实际文件,make 会跳过隐含规则搜索。这就是声明phony 目标会改善性能的原因,即使你并不担心实际文件存在与否。

 

完整的例子如下:

 

.PHONY : clean

 

clean :

 

rm *.o temp

 

5.22上午 外教 linux 听力812