千家信息网

预定义变量的使用(五)

发表于:2025-12-02 作者:千家信息网编辑
千家信息网最后更新 2025年12月02日,在 makefile 中存在一些预定义的变量,如自动变量:$@,$^,$< 等;还有一些特殊变量,如:$(MKAE),$(MAKECMDGOALS),$(MKAEFILE_LIST),$(MAKE_V
千家信息网最后更新 2025年12月02日预定义变量的使用(五)

在 makefile 中存在一些预定义的变量,如自动变量$@,$^,$< 等;还有一些特殊变量,如:$(MKAE),$(MAKECMDGOALS),$(MKAEFILE_LIST),$(MAKE_VERSION),$(CURDIR),$(.VARIABLES)等。下来我们先来解释下自动变量的意义:a> $@ 是指当前规则中触发命令被执行的目标;b> $^ 是指当前规则中的所有依赖;c> $< 是指当前规则中的第一个依赖。关于自动变量的使用如下

下来我们以代码为例来进行分析说明

.PHONY : all first second thirdall : first second third    @echo "\$$@ => $@"    @echo "$$^ => $^"    @echo "$$< => $<"first:second:third:

看看编译结果

我们看到和我们之前解释的是一样的。$@便是打印我们的目标名,$^ 打印的便是依赖条件,$< 打印的是依赖当中的第一个。那么我们就可以将之前写的 makefile 进行改写了

CC := g++TARGET := hello.out$(TARGET) : func.o main.o    $(CC) -o $@ $^func.o : func.c     $(CC) -o $@ -c $^main.o : main.c    $(CC) -o $@ -c $^.PHONY : rebuild clean allrebuild : clean allall : $(TARGET)    clean :     rm *.o $(TARGET)

我们来看看编译结果是否和之前的一样的。

我们看到和之前的效果是一样的,那么这样做的好处是什么呢?在大型的项目中,我们后面难免会进行新功能的开发,那么此时写的新文件便可以海子街放在目标之后,其他的不用管就OK了,这样就非常方便。
下来我们来看看那些特殊变量的含义:a> $(MAKE) 是指当前 make 解释器的文件名;b>$(MAKECMDGOALS) 是指命令行中指定的目标名(make 的命令行参数);c>$(MAKEFILE_LIST) 指 make 所需要处理的 makefile 文件列表,当前 makefile 的文件名总是位于列表的最后,文件名之间以空格进行分隔。

下来我们还是以代码为例来进行说明

.PHONY : all out first second third testall out :    @echo "$(MAKE)"    @echo "$(MAKECMDGOALS)"    @echo "$(MAKEFILE_LIST)"first :    @echo "first"second :    @echo "second"third :    @echo "third"test :    @$(MAKE) first    @$(MAKE) second    @$(MAKE) third

我们来看看编译效果

我们第一次直接 make 的时候,因为当前解释器是 make ,所以会直接打印 make,命令行后面没带参数,因此第二行是空的,最后一行是因为只有一个 makefile,但是在它前面会有一个空格。第二次 make all 的时候,因为命令行的参数为 all,所以第二行会输出 all。第三次 make test 的时候,因为需要进行三次 MAKE,所以会有三次进入到对应目录下进行进行 make 命令。第四次 make all out 的时候,在执行 all 的时候分别打印一次,在执行 out 的时候再次会打印一次。

下来我们来继续看看另一些特殊变量的含义:a> $(MAKE_VERSION) 是指当面 make 解释器的版本;b> $(CURDIR) 是指当前 make 解释器的工作目录;c> $(.VARIABLES) 是指所有已经定义的变量名列表(预定义变量和自定义变量)。

还是以代码为例来进行说明

.PHONY : test1 test2TDelphi := Delphi TangD.T.Software := D.T.test1 :    @echo "$(MAKE_VERSION)"    @echo "$(CURDIR)"    @echo "$(.VARIABLES)"test2 :    @echo "$(RM)"

我们来看看编译效果

我们看到直接 make 的时候,执行的是 test1 目标,先是打印当前 make 的版本,接着是当前目录,然后是当前的环境变量。我们在下面用 make -v 直接看到当前 make 解释器的版本就是 3.81,而且当前目录就是 /mnt/hgfs/winshare/mentu/make1/5 。接着我们看到了我们自己定义的两个环境变量。接下来在执行 make test2,看到 RM 其实就是 rm -f,就是强制删除的符号,我们是不是就可以在前面定义的 makefile 中将 rm -f 全部替换为 $(RM) 呢。通过对 makefile 中的预定义变量的学习,总结如下:1、makefile 提供了预定义变量供开发者使用;2、预定义变量的使用能够使得 makefile 的开发更高效;3、自动变量是 makefile 中最常见的元素;4、使用 $(.VARIABLES) 能够获取所有的特殊变量。


欢迎大家一起来学习 makefile,可以加我QQ:243343083

变量 时候 解释 命令 文件 目标 解释器 特殊 就是 目录 编译 代码 参数 效果 文件名 版本 规则 开发 含义 环境 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 护苗网络安全教育课视屏 日本硬件 软件开发 信息管理与网络技术有关系吗 崇明区机械软件开发服务生产厂家 北京班信息网络技术有限公司 电子商务软件开发方向 华为云星耀服务器属于什么服务器 有关网络安全书籍 教育软件开发公司哪个好 计算机网络技术毕业设置 星帆网络技术有限公司 小学生网络安全知识判断题 上海轩和网络技术是哪个软件 随机抽样数据库 网络安全画报大学 漫画安全网络安全科普宣传册 杭州对日软件开发公司有哪些 三丰云虚拟服务器怎么样 北京天融信网络技术安全有限公司 数据库原理章节介绍 室内网络安全审计 阿里云数据库和自己安装数据库 服务器不能连接电脑怎么办 正方数据库 教育软件开发公司哪个好 重庆微信软件开发 俩手机之间怎样传输数据库 网络安全法 6.1 贵州省优汇多互联网科技有限公司 关于校园网络安全的ppt
0