欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

【Makefile由浅入深完全学习记录5】预定义变量的使用

程序员文章站 2024-02-17 14:13:22
...

今天学习Makefile预定义变量的使用,加qq:1126137994.微信:liu1126137994一起学习更多技术!!!

1.预定义变量:自动变量

在Makefile中存在一些预定义过的变量,我们可以直接拿来使用而不用自己再定义

  • 自动变量
aaa@qq.com , $^ , $<
  • 特殊变量
$(MAKE) , $(MAKECMDGOALS) , $(MAKEFILE_LIST) , $(MAKE_VERSION) , $(CURDIR) , $(.VARIABLES) ...

我们先来看看特殊变量的意义:
aaa@qq.com
*代表当前规则中,触发命令后,会被执行的目标

-$^
*代表当前规则中的所有的依赖

-$<
*代表当前规则中的第一个依赖

自动变量的使用示例如下所示:


all : first second third
    @echo "\$aaa@qq.com => aaa@qq.com"
    @echo "$$^ => $^"
	@echo "$$< => $<"

注意:


 1. "$"对于Makefile来讲具有特殊含义,所以输出时,要加一个"$"进行转义
 2. "aaa@qq.com"队友Bash shell 具有特殊意义,所以输出时需要加上"\"进行转义

下面给出一个例子来理解上述的概念:


.PHONY : all first second third 

all : first second third
    @echo "\aaa@qq.com => aaa@qq.com"
    @echo "$$^ => $^"
	@echo "$$< => $<"

firtst:
second:
third:

输入make运行后,显示:
【Makefile由浅入深完全学习记录5】预定义变量的使用

下面我们将第四课的Makefile修改一下,使用自动变量让内容更简洁(点击查看第四课的博客:第四课内容

CC := g++
TARGET := hello-world.out

$(TARGET) : func.o main.o
    $(CC) -o $(TARGET) func.o main.o

func.o : func.c
    $(CC) -o func.o -c func.c

main.o : main.c
    $(CC) -o main.o -c main.c

.PHONY : rebuild clean all

rebuild : clean all


all : $(TARGET)

clean :
    rm *.o $(TARGET)

将上述Makefile修改为以下的内容:

CC := g++
TARGET := hello-world.out

$(TARGET) : func.o main.o
    $(CC) -o $(TARGET) func.o main.o

func.o : func.c
    $(CC) -o func.o -c func.c

main.o : main.c
    $(CC) -o main.o -c main.c

.PHONY : rebuild clean all

rebuild : clean all


all : $(TARGET)

clean :
    rm *.o $(TARGET)

可以看出,使用自动变量后,Makefile的内容变得更简洁!!!

2.预定义变量:特殊变量

一些特殊变量的意义:

  • $(MAKE) 当前make解释器的文件名
  • $(MAKECMDGOALS) 命令行中指定的目标名(make的命令行参数)
  • $(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 test:
【Makefile由浅入深完全学习记录5】预定义变量的使用
输入:make all :
【Makefile由浅入深完全学习记录5】预定义变量的使用
输入:make first :
【Makefile由浅入深完全学习记录5】预定义变量的使用

一些特殊变量的意义:

  • $(MAKE_VERSION) 代表当前make解释器的版本
  • $(CURDIR) 代表当前make解释器的工作目录
  • $(.VARIABLES) 所有已经定义了的变量名列表(预定义和自定义的变量都包括在内)

看下面一个例子来理解一下上面三个特殊变量的意义与使用方法:


.PHONY : test1 test2

TDelphi := Delphi Tang
D.T.Software := D.T.

test1 :
    @echo "$(MAKE_VERSION)"
    @echo "$(CURDIR)"
    @echo "$(.VARIABLES)"

test2 :
    @echo "$(RM)"

输入make运行结果为:
【Makefile由浅入深完全学习记录5】预定义变量的使用
从上面运行结果可以看出我的make的版本是:3.81 make解释器的目录为:/home/delphi 而且可以在变量名列表中找到我们定义的变量D.T.Software 与 TDelphi

3.总结

  1. makefile中提供了预定义变量供开发者使用
  2. 预定义变量的使用能够使开发变得更加高效
  3. 自动变量是makefile中最常见的变量
  4. 使用$(.VARIABLES)能够获取所有的特殊变量

想一起探讨以及获得各种学习资源加我:
qq:1126137994
微信:liu1126137994
可以共同交流关于嵌入式,操作系统,C++语言,C语言,数据结构等技术问题。