Makefile的规则

1.make如何确定目标文件过期?
对比目标文件和目标文件的依赖,如果目标文件的修改时间戳要比依赖文件的时间戳老,则过期,需要重新生成,否则不需要执行命令重新生成。

2.在编译.c或者.cpp/.cc文件的时候,我们不需要把头文件加入命令中,因为一般.c文件里面就包含了头文件。而在编写目标的依赖的时候,我们还是要把头文件加入到依赖里面的。

可以看看下面这个例子(这个例子摘自《GNU make中文版》 徐海兵译著):

foo.o : foo.c defs.h # module for twiddling the frobs
cc -c -g foo.c

可以看到头文件被加入目标的依赖中去了。其中#是注释符。

2.目标的依赖其实还分为两种
1.常规依赖,特性为每次更新这种依赖,目标文件在make的时候就要重建。
2.order-only依赖,特性为,目标文件不存在的时候才会参与规则命令的执行。如果目标文件存在,即使修改了这种依赖,也不会执行规则的命令来重建目标文件。

这两种依赖一般由管道符来分割“|”,前面是常规依赖,后面的order-only依赖。

可以看看下面这个例子(这个例子摘自《GNU make中文版》 徐海兵译著):

LIBS = libtest.a
foo : foo.c | $(LIBS)
$(CC) $(CFLAGS) $< -o $@ $(LIBS)

3.文件名使用通配符
Maekfile 中表示文件名时可使用通配符。可使用的通配符有:“*”、“?”和“[…]”。
在 Makefile 中通配符的用法和含义和 Linux(unix)的 Bourne shell 完全相同。

Makefile 中统配符可以出现在以下两种场合:

  1. 可以用在规则的目标、依赖中,make 在读取 Makefile 时会自动对其进行匹配
    处理(通配符展开);
  2. 可出现在规则的命令中,通配符的通配处理是在 shell 在执行此命令时完成的。

除这两种情况之外的其它上下文中,不能直接使用通配符。而是需要通过函数
“wildcard”(这个以后有时间介绍函数的时候再进一步介绍)来实现。

如果文件名中就包含了通配符,那么在Makefile书写的时候要加上\来进行转义,否则make命令将会把它解释为通配符。

5.目录搜索
a.一般搜索
GNU make 可以识别一个特殊变量“VPATH”。通过变量“VPATH”可以指定依赖文件的搜索路径,当规则的依赖文件在当前目录不存在时,make 会在此变量所指定的目录下去寻找这些依赖文件。通常我们都是用此变量来指定规则的依赖文件的搜索路径。其实“VPATH”变量所指定的是 Makefile 中所有文件的搜索路径,包括了规则的依赖文件和目标文件。定义变量“VPATH”时,使用空格或者冒号(:)将多个需要搜索的目录分开。make搜索目录的顺序是按照变量“VPATH”定义中的目录顺序进行的(当前目录永远是第一搜索目录)。

b.选择性搜索
“vpath”关键字(全小写的
它的使用方法有三种:
1) vpath PATTERN DIRECTORIES
为所有符合模式“PATTERN”的文件指定搜索目录“DIRECTORIES”。多个目
录使用空格或者冒号(:)分开。
2) vpath PATTERN
清除之前为符合模式“PATTERN”的文件设置的搜索路径。
3) vpath
清除所有已被设置的文件搜索路径。

vapth 使用方法中的“PATTERN”需要包含模式字符“%”。“%”意思是匹配一个
或者多个字符,例如,“%.h”表示所有以“.h”结尾的文件。如果在“PATTERN”中
没有包含模式字符“%”,那么它就是一个明确的文件名,这样就是给定了此文件的所在目录。

全部评论

相关推荐

和蔼:在竞争中脱颖而出,厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务