千家信息网

make--伪目标 、不同的赋值方式、变量

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,一.伪目标的引入a.默认情况下1.make认为目标对应一个文件2.make比较目标文件和依赖文件的新旧关系,决定是否执行命令3.make以文件处理作为第一优先级示例hello.out all : fu
千家信息网最后更新 2026年10月31日make--伪目标 、不同的赋值方式、变量

一.伪目标的引入

a.默认情况下
1.make认为目标对应一个文件
2.make比较目标文件和依赖文件的新旧关系,决定是否执行命令
3.make以文件处理作为第一优先级
示例

hello.out all : func.o main.o    gcc -o hello.out func.o main.ofunc.o : func.c    gcc -o func.o -c func.cmain.o : main.c    gcc -o main.o -c main.cclean :    rm *.o hello.out

该示例与之前的示例加上了clean


由上面的图可以看出,在第二个我们假设在目录下存在一个clean文件(可以通过touch命令来创建),如果我们此时运行make clean,会发现make总是提示clean文件是最新的,make这种行为从原理上来说是因为它将clean当作文件来处理,由于在当前目录下找到了这个文件,加上clean目标没有任何先觉条件,所以当要求make为我们创建clean目标时它就会认为clean是最新的,从而"拒绝"进行文件的清除操作。
出现这种情形,是因为我们对于clean目标的定义与make所理解的有所出入。目标文件名与Makefile中的目标名重名在现实项目中是难免的,所以假目标的概念被提出
makefile中的伪目标
1.通过.PHONY关键字声明一个伪目标
2.伪目标不对应任何实际的文件
3.不管伪目标的依赖是否更新,命令总是执行
伪目标的语法:先声明,后使用

加入.PHONY的示例

.PHONY: cleanhello.out all : func.o main.o    gcc -o hello.out func.o main.ofunc.o : func.c    gcc -o func.o -c func.cmain.o : main.c    gcc -o main.o -c main.cclean :    rm *.o hello.out

运行结果如图所示

如图所示,我们可以看出在当前目录下即使存在clean文件,有了伪目标.PHONY的使用运行make clean命令会执行删除操作

二.不同的赋值方式与变量

1.makefile中支持程序设计语言中变量的概念
2.makefile中的变量只代表文本数据(字符串)
3.makefile中的变量名规则
(变量名可以包含字符、数字、下划线;不能包含":","#","="或" ";变量名大小写敏感)
A.变量的定义和使用(通过使用变量可以使得Makefile更具有可维护性)

.PHONY: cleanCC:=gccTARGET:=hello.out$(TARGET) : func.o main.o    $(CC) -o $(TARGET) func.o main.ofunc.o : func.c    $(CC) -o func.o -c func.cmain.o : main.c    $(CC) -o main.o -c main.c.PHONY : rebuild clean allrebuild : clean allall : $(TARGET)clean :    rm *.o $(TARGET)

运行结果如图示

可以看到在加入了变量之后,生成的结果是一样的
B.makefile中变量的赋值方式
1.简单赋值(:=)
2.递归赋值(=)
3.条件赋值(?=)
4.追加赋值(+=)
a.简单赋值(:=)
1.程序设计语言中的通用的赋值方式
2.只针对当前语句的变量有效

.PHONY: allx=fooy=$(x)bx=laterxx:=fooyy:=$(xx)bixx:=laterall:    @echo "xx=$(xx),yy=$(yy)"

结果如图

b.递归赋值(=)
1.赋值操作可能影响多个其他变量
2.所有与目标变量相关的其他变量都将受到影响

.PHONY: allfoo=$(bar)bar=$(ugh)ugh=MYLOVEall:    @echo $(foo)

结果如图

c.条件赋值(?=)
1.如果变量未定义,使用赋值符号中的值定义变量
2.如果变量已经定义,则赋值无效

.PHONY: allx:=fooy:=$(x)bx?=newall:    @echo "x=>$(x)"    @echo "y=>$(y)"


d.追加赋值(+=)
1.原变量值之后加上一个新值
2.原变量值与新值之间由空格隔开

.PHONY: allx:=fooy:=$(x)bx+= $(y)all:    @echo "x=>$(x)"    @echo "y=>$(y)"

三.预定义变量的使用

1.$@ 用于表示一个规则的目标 当一个规则中有多个目标时 $@所指的是其中任一造成规则命令被运行的目标
2.$^ 表示的是规则中的所有先决条件
3.$< 表示的是规则中的第一个先决条件

运用这些规则对之前的代码进行修改

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)

结果如图所示

这样写的原因在之前就已经提到使得Makefile更具有可维护性

目标 变量 文件 规则 结果 如图 命令 条件 运行 示例 方式 目录 先决条件 可维护性 多个 字符 概念 程序 程序设计 语言 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网是第几次科技革命的成果 金融科技还是互联网 上海挚品互联网科技 润盈互联网科技 齐家互联网科技有限公司 互联网科技公司招聘 汉立互联网科技有限公司联系电话 小米互联网科技园设置 互联网系的金融科技公司 栖莱科技互联网股份有限公司 世界互联网科技公司市值排名 知域互联网科技有限公司大骗子 坤平互联网科技 浙南科技城互联网大厦建设工程 华夏恒生互联网科技013171 伍佰万互联网科技怎么赚钱 唐山双旺合互联网科技产业园 盐城市攀科互联网科技有限公司 保山浩联互联网科技有限公司 青岛互联网科技园 重生之互联网科技帝国 南京欣网互联网科技 亿账通互联网科技 互联网科技公司做什么 农村开互联网科技讲堂 现代科技和互联网有关系吗 互联网科技教育视频 华夏互联网科技业 美国互联网科技实力 福建互联网展示科技馆设计
0