x = foo
y = $(x) bar
x = xyz
在上例中,y的值将会是 xyz bar,而不是 foo bar 。
(2)“:=”
“:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。
x := foo
y := $(x) bar
x := xyz
在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。
不一定,可以不包含进去。makefile是根据依赖项是否被修改决定是否重新执行command。如果不把头文件写入依赖项中,则面临的风险就是修改了头文件,目标文件不会被重新编译。我们的原则是,自己定义的头文件写入依赖项,库的头文件无需包含,除非你要修改库的头文件。
VPATH是makefile的特殊变量,只能用来指明makefile寻找目标文件的依赖项所在的目录,不能帮助编译器寻找所需编译的文件。
vpath是makefile的关键字,VPATH是makefile的特殊变量,两者的区别在于VPATH指定全局的搜索路径,而vpath可以针对特定的文件搜索路径。
vpath命令有三种形式:
vpath pattern path : 符合pattern的文件在path目录搜索。
vpath pattern : 清除pattern指定的文件搜索路径
vpath : 清除所有文件搜索路径。
例如:
vpath %.h ./include //指定.h类型文件的搜索路径是include
vpath %.cpp ./src //指定.cpp类型文件的搜索路径是src
make执行的命令前面加了@字符,则不显示命令本身而只显示它的结果。
替换变量中指定的内容有两种方式。makefile 多行注释
(1)模式匹配替换字符串函数patsubst
用法如下:
res=$(patsubst %.c,%.o,$(var) )
以上表示将变量$(var)中所有以.c结尾的字符串变成.o结尾。patsubst的英文全称是pattern substitute string,是三个单词的前三个或两个字母拼接组成的名字。
(2)使用变量的替换引用
这里用到makefile里的替换引用规则,即用指定的变量替换另一个变量。其的用法格式如下:
res=$(var:%.a=%.b)
例如:
foo:=a.c b.c
bar=$(foo:%.a=%.o)
那么bar就变成了a.o b.o。
以上表示将变量foo中以.a结尾的字符串替换成.b结尾并返回结果。注意,字符串处理函数并不会改变原有的字符串,变量的替换引用规则也不会改变原来字符串。实际上变量的替换引用是模式匹配替换函数patsubst的一个简化实现。
$@,$^,$<代表的意义分别是:
$@:目标文件;
$^:所有的依赖文件;
$<:第一个依赖文件。makefile 多行注释
通过以上特殊变量,可以简化Makefile。例如:
main:main.o mytool1.o mytool2.o
gcc -o $@ $^
main.o:main.c mytool1.h mytool2.h
gcc -c $<$(Target):$(OS)
$(MAKE) -C $(SUBDIR)
#或者
$(Target):$(OS)
cd subdir && $(MAKE)
解释:当生成target目标对象时,会执行$(MAKE) -C $(SUBDIR)这条命令,进入目录ODIR,该目录下有一个makefile,并执行。其中,$(MAKE) 值make预定义的变量,一般指的就是make,无需修改,可通过make -p查看make所有的预定义的变量。当然,也可直接指明为make,即make -C $(SUBDIR)。
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-40643-3.html
恶意投诉
其目的是试探中国在南海岛屿的底线
晶晶跟几年前一样