make之vpath:
变量“VPATH”的定义中,使用空格或者冒号(:)将多个目录分开。make 搜索的目录顺序
按照变量“VPATH”定义中顺序进行(当前目录永远是第一搜索目录)。
例如:
VPATH = src:../headers
它指定了两个搜索目录,“src”和“../headers”。对于规则“foo:foo.c”如果“foo.c”在“src”
目录下,此时此规则等价于“foo:src:/foo.c”
对于第二种来说:当需要为不类型的文件指定
不同的搜索目录时需要这种方式
vpath:关键字
它所实现的功能和上一小节提到的“VPATH”变量很类似,但是
它更为灵活。它可以为不同类型的文件(由文件名区分)指定不同的搜索目录。它的使用方法有三
种
1、vpath PATTERN DIRECTORIES
为符合模式“PATTERN”的文件指定搜索目录“DIRECTORIES”。多个目录使用空格或者
冒号(:)分开。类似上一小节的“VPATH”
2、vpath PATTERN
清除之前为符合模式“PATTERN”的文件设置的搜索路径
3、vpath
清除所有已被设置的文件搜索路径。
对于vpath的详细说明待续。
在执行make命令的时候,根据makefile执行步骤,首先读入所有的makefile文件,那么
VPATH = include:src //指定了makefile的搜索路径
或者
vpath %.h include //指定.h类型文件的搜索路径是include
vpath %.cpp src //指定.cpp类型文件的搜索路径是src
这仅仅是对于makefile来说搜索目标和依赖文件的路径,但是对于命令行来说是无效的,也就是说
在执行g++或者gcc时不会自动从VPATH 或者vpath中自动搜索要包含的头文件等信息文件
此时要用到了 -I 或者--incude +路径
例如依赖是:
main.o:main.cpp hello.h
即g++ -c $< -Iinclude,这时候,g++会自动从include目录中搜索要包含的hello.h头文件
Makefile 的规则中的目标可以不止一个,其支持多目标,有可能我们的多个目标同时依赖于一个文件,并且其生成的命令大体类似。于是
我们就能把其合并起来。当然,多个目标的生成规则的执行命令是同一个,这可能会可我们带来麻烦,不过好在我们的可以使用一个自动
化变量“$@”(关于自动化变量,将在后面讲述),这个变量表示着目前规则中所有的目标的集合,这样说可能很抽象,还是看一个例子吧。
bigoutput littleoutput : text.g
generate text.g -$(subst output,,$@) > $@
上述规则等价于:
bigoutput : text.g
generate text.g -big > bigoutput
littleoutput : text.g
generate text.g -little > littleoutput
其中,-$(subst output,,$@)中的“$”表示执行一个Makefile 的函数,函数名为subst,后面的为参数。关于函数,将在后面讲述。这里的这
个函数是截取字符串的意思,“$@”表示目标的集合,就像一个数组,“$@”依次取出目标,并执于命令。
make的一些tips:
命令执行:
当依赖目标新于目标时,也就是当规则的目标需要被更新时,make会一条一条的执行其后的命令。需要注意的是,如果你要让上一条命
令的结果应用在下一条命令时,你应该使用分号分隔这两条命令。比如你的第一条命令是cd 命令,你希望第二条命令得在cd 之后的基础上运行,那么你就不能把这两条命令写在两行上,而应该把这两条命令写在一行上,用分号分隔
命令出错忽视处理:
方法一:
全局的办法是,给make 加上“-i”或是“--ignore-errors”参数,那么,Makefile 中所有命令都会忽略错误。而如果一个规则是以
“.IGNORE”作为目标的,那么这个规则中的所有命令将会忽略错误。
方法二:
make 的参数的是“-k”或是“--keep-going”,这个参数的意思是,如果某规则中的命令出错了,那么就终目该规则的执
行,但继续执行其它规则。
方法三:
在Makefile 的命令行前
加一个减号“-”(在Tab 键之后),标记为不管命令出不出错都认为是成功的。如:
clean:
-rm -f *.o