浅谈makefile
1. makefile 中的通配符
如果想定义一些比较类似的文件,我们自然就会想到通配符,makefile中我们可以使用3中通配符,分别是:
1. “ * ” 代表任意长度的字符串
2. “ ? “ 代表单个任意的字符
3. “ ” 代表一个范围类的字符,如表示abc中的字符
那么,如果我们的文件名中有“*”,这个时候,我们如何来区分是通配符,还是真实的“*”呢?我们可以使用转义字符 ””来实现这个功能。使用“*”表示使用真实的”*“。
我们举个列子来使用一下:
我们可以使用” * “来删除所有的后缀为.o的文件。这里我们是使用了伪目标。
再比如:
这里表示,生成all目标的依赖文件时当前目录下的所有c文件。这样省去我们一个一个的敲名字。
注意:
通配符使用在makefile的变量中时,情况有些不一样,比如:
这里是在makefile中给一个变量赋值,但是这里的通配符”*”却不会展开,这里的这条变量赋值语句就相当于C语言中的宏定义一样,C语言中的宏定义,我想大家都懂的。
2. 浅谈伪目标
一般的目标如下:
按照上面的规则,all目标有自己的依赖文件,有自己的生成方法。最终会生成一个名称为all的文件。但是伪目标不一样:
1. 首先,伪目标没有依赖文件
2. 伪目标表示的目标,最终并不真正的生成,相当于这只是一个标签
注意:
但是有一种情况使我们要注意的,就是我们伪目标的名称不能是工程中存在的文件名,为了避免这种情况发生,我们可以显示的指明某个目标为伪目标,用法如下:
我们使用关键字 PHONY来指明后面的目标是一个伪目标。这样,就算工程中有一个名称为clean的文件,那么也没有影响了。因为伪目标没有依赖条件来判断是否执行,所以伪目标总是被执行的。
另外强调一点,当遇到目标体clean时,make先查看其是否有依赖体,因为clean没有依赖体,所以make认为目标体是最新的而不执行任何操作。为了编译这个目标体,必须输入make clean。
这个系类的笔记汇总贴在:linux应用程序开发入门笔记系列,欢迎大家交流指正~