预定义变量的使用(五)-创新互联

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

我们提供的服务有:成都网站设计、网站建设、微信公众号开发、网站优化、网站认证、马边彝族ssl等。为数千家企事业单位解决了网站和推广的问题。提供周到的售前咨询和贴心的售后服务,是有科学管理、有技术的马边彝族网站制作公司

预定义变量的使用(五)

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

.PHONY : all first second third all : 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 all rebuild : clean all all : $(TARGET)      clean :      rm *.o $(TARGET)

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

预定义变量的使用(五)

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

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

.PHONY : all out first second third test all 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 test2 TDelphi := Delphi Tang D.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。

另外有需要云服务器可以了解下创新互联cdcxhl.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。


文章名称:预定义变量的使用(五)-创新互联
URL地址:http://ybzwz.com/article/didhsg.html