你知道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/     te   st.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:../heade     rs  

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_m     ai   n.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

你知道Makefile变量具体是怎样的?_设计制作_电源/新能源
81
56
0
88

相关资讯

  1. 1、TVB首位大满贯花旦有准备升级成人母慨叹:生仔都没时间4112
  2. 2、她是吴京的“对象”黄渤和她对戏起生理反应,今42岁无人敢娶!280
  3. 3、刷夜抓猪?!《经山历海》王丽坤真拼!2601
  4. 4、从蔡少芬张晋到范冰冰李晨,女强男弱的他们最后都在一起了吗?4523
  5. 5、《御赐小仵作》王子奇苏晓彤宣传期无营业,原来是“翟天临”的锅1219
  6. 6、《权利的游戏》获22项艾美奖提名每集耗费千万美元2055
  7. 7、《有种》11月8日上映汪峰旧爱出演腹黑女主唱3680
  8. 8、宝莱坞影坛一姐迪皮卡大婚在即日期、地点、婚纱设计师纷纷曝光234
  9. 9、彭昱畅又演青春片!8.2分剧集原班人马合作,风犬少年们回来了368
  10. 10、“性侵案”五审结束:高云翔穿西装帅气出镜,却未见妻子董璇1634
全部评论(0)
我也有话说
0
收藏
点赞
顶部