您的位置 首页 基础

你知道Makefile变量详细是怎样的?

你知道Makefile变量具体是怎样的?-注意这两种替换的方式都得使用变量名,不能使用变量的内容,即不能写成诸如$($(VAR):o=a)的形式,其他返回内容的函数也不行,均会导致替换的失败
makefile中有两种变量替换,

自界说变量

= 是最基本的赋值,会把整个makefile打开之后再决议是多少

x=fooy=$(x)bar #y是asdbar,不是foobarx=asd

:= 是掩盖之前的值,和=不同,和赋值的方位有关

x=fooy:=$(x)bar #y是foobarx=asd

?= 是假如没有被赋值过就赋予等号后边的值,赋过了就不管了
+= 是增加等号后边的值

变量的运用

和shell相同,makefile经过$(FLAGS)来读取变量FLAGS的值,关于$自身,运用$$读取

变量替换

留意这两种替换的方法都得运用变量名,不能运用变量的内容,即不能写成比如$($(VAR):o=a)的方法,其他回来内容的函数也不可,均会导致替换的失利
makefile中有两种变量替换,

形如$(var:a=b)或许${var:a=b},是把var中以a结束的变量替换为b

OBJ=./obj/test.oOBJ2=$(OBJ:o=a)all:@echo “OBJ:$(OBJ)”@echo “OBJ2:$(OBJ2)”#############################$make allOBJ:./obj/test.oOBJ2:./obj/test.a

运用形式匹配的方法表明替换内容

OBJ=./obj/test.oOBJ2=$(OBJ:%.o=%.a)all:@echo “OBJ:$(OBJ)”@echo “OBJ2:$(OBJ2)”############################$make allOBJ:./obj/test.oOBJ2:./obj/test.a

主动化变量

? 一切比方针新的依靠的调集,以空格分隔,一般用他们的值,即$?
@ 规矩中的方针文件集,假如有多个方针,那么便是匹配于方针中形式界说的调集,一般用他们的值,即$@
% 仅当方针是函数库文件中,表明规矩中的方针成员名,假如不是,为空,一般用他们的值,即$%
< 依靠方针中的第一个方针的姓名,一般用他们的值,即$<
^ 一切依靠方针的调集,以空格分隔,去除重复的依靠方针,一般用他们的值,即$^
+ 一切依靠方针的调集,不去除重复的依靠方针,一般用他们的值,即$+
* 表明方针形式中 %之前的部分,一般用他们的值,即$*
@D 表明@的目录部分(不以/结束),一般用他们的值,即$(@D)
@F 表明@的文件部分,一般用他们的值,即$(@F)
。。。别的6个同理

环境变量

makefile会主动读取体系中的环境变量,并仿制一份一模相同的,假如用户在makefile中界说的同名的变量,那么本来的环境变量就会被掩盖

VPATH

虚途径,假如没有指明VPATH变量,make只会在当时目录中去寻觅依靠文件和方针文件,假如界说了VPATH,则make会在当时目录找不到的情况下,到所拟定的目录中去找文件,这个变

VPATH=src:../headers

vpath

vpath是一个指令,能够用来查找文件,一般有三种用法:

VPATH 为契合形式的文件指定查找目录

VPATH  铲除契合形式的文件的查找目录

VPATH 铲除一切已被设置好了的文件查找目录
这儿,需求包括 %字符,eg: vpath %.h ../headers
假如多条vpath句子中呈现了重复的,则会依照先后顺序查找
print: *.c #依靠联系的通配符会被主动打开,表明print方针依靠于一切的.c 文件
object=*.c #变量中的通配符不会被打开object便是 “.c”需求运用wildcard来打开

比如

#Makefile文件CC:=gccCFLAGS:= -O2 -I ./includeTARGET:=linkstackOBJS:=linkstack.o linkstack_main.oHDRS:=linkstack.hSRC:=$(OBJS:%.o=%.c) #留意,这儿不能用$(OBJS)VPATH=./src:./include/#vpath %.h ./include/$(TARGET):$(OBJS) $(CC) $(CFLAGS) $^ -o $@$(OBJS):$(SRC) $(HDRS) $(CC) -c $^ $(CFLAGS).PHONY:cleanclean: $(RM) $(OBJS) $(TARGET)

make履行前后的改变

$tree.├── include│   └── linkstack.h├── Makefile└── src ├── linkstack.c └── linkstack_main.c2 directories, 4 files$makegcc -c ./src/linkstack.c ./src/linkstack_main.c -O2 -I ./includegcc -O2 -I ./include linkstack.o linkstack_main.o -o linkstack$tree.├── include│   └── linkstack.h├── linkstack├── linkstack_main.o├── linkstack.o├── Makefile└── src ├── linkstack.c └── linkstack_main.c2 directories, 7 files$make clean$tree.├── include│   └── linkstack.h├── Makefile└── src ├── linkstack.c └── linkstack_main.c2 directories, 4 files
 

声明:本文内容来自网络转载或用户投稿,文章版权归原作者和原出处所有。文中观点,不代表本站立场。若有侵权请联系本站删除(kf@86ic.com)https://www.86ic.net/zhishi/jichu/99896.html

为您推荐

联系我们

联系我们

在线咨询: QQ交谈

邮箱: kf@86ic.com

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

返回顶部