你知道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

Imagination最新AI+GPU+CPU异构计算架构如何满足未来边缘智能应用
电磁阀不工作的原因
探讨骇人听闻的四种人工智能发展前景
VOC是什么?VOC的危害
兆讯216兆M3内核MCU,MH2103ACCT6完美替代STM32F103C8T6/CBT6
你知道Makefile变量具体是怎样的?
ddos是什么意思呀?ddos攻击怎么防护
什么是存储区域网络?SAN和VMware vSAN有何区别?
紫光国微入选70家国产IC设计上市公司综合实力排行榜
数字接地电阻测试仪的技术指标
100家企业集结 激光显示企业已成命运共同体
号称全球最小GoTube超袖珍电动车 可折叠成背包大小
一体化集成技术应用智能环网柜方案
联通5G产业母基金目前已在中国证券投资基金业协会完成备案
人工智能,大数据,云计算三者关系变化
Allegro16.6怎么降低版本?
工业变频器的电磁兼容标准须知
华为为什么会在东莞发布鸿蒙OS?你怎么看?
vivo新机已获得工信部认证,预装基于Android 10的FunTouch OS软件
Xilinx Zynq7035算力指标