通用Makefile文件简单入门和编写(2)

本文介绍了Makefile中变量的使用,包括变量定义、赋值方式以及常见的自动化变量如$@, $*, $+, $<, $?和$^的含义和用法,通过实例帮助理解如何在Makefile命令中灵活运用这些变量。" 129503677,10966202,从外行到大厂测开:我的跨行转型之路,"['软件测试', '测试工程师', '自动化测试', '职场和规划', '程序人生']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Makefile中使用变量

Makefile文件可以像C一样使用变量。变量的命名字可以包含字符、数字,下划线(可以是数字开头),但不应该含有 : 、 # 、 = 或是空字符(空格、回车等)。变量是大小写敏感的,“foo”、“Foo”和“FOO”是三个不同的 变量名。这里看一个例子:

objects = program.o foo.o utils.o
program : $(objects)
    cc -o program $(objects)

$(objects) : defs.h

相当于

program : program.o foo.o utils.o
    cc -o program  program.o foo.o utils.o

program.o foo.o utils.o : defs.h

这里给变量赋值一共有4种符号:==?=+=
先说比较简单的?=如果之前定义了该变量,那么就什么也不做,例:

foo=123
foo?=456
#$(foo)=123

接着是+=,跟C语言中的连接字符串strcat一个意思。直接看例子:

foo=test1.c test2.c
foo+=test3.c
#$(foo)=test1.c test2.c test3.c

最后就是=:=两个都是表示赋值,但是:=表示的是立即赋值而=表示的是延时赋值。这么说可能有点不太明白,我们直接看一个例子:

x = sb;

y = u$(x) 

x = all

#$(y)=uall
x := sb;

y := u$(x) 

x := all

#$(y)=usb

在项目中,为了书写的方便,往往在命令中使用自动化变量,例:

OBJS = kang.o yul.o
CC = gcc
CFLAGS =-Wall -O -g

david : $ (OBJS)
$(CC) $^ -o $@

kang.o : kang.c kang.h
$(CC) $(CFLAGS) -c $< -o $@

yul.o : yul.c yul.h
$(CC) $(CFLAGS) -c $< -o $@

相当于:

OBJS = kang.o yul.o
CC = gcc
CFLAGS =-Wall -O -g

david : kang.o yul.o
gcc kang.o yul.o -o david

kang.o : kang.c kang.h
gcc Wall -O -g -c  kang.c -o kang.o

yul.o : yul.c yul.h
gcc  Wall -O -g -c -c yul.c -o yul.o

下面介绍一些常用的自动化变量:

  • $ @
    表示规则中的目标文件集。在模式规则中,如果有多个目标,那么,"$@"就是匹配与目标中模式定义的集合。

  • $*
    不包含扩展名的目标文件名称

  • $+
    所有的依赖文件,以空格分开,并以出现的先后为序,可能包含重复的依赖文件

  • $<
    第一个依赖文件的名称

  • $?
    所有时间戳比目标文件晚的依赖文件,并以空格分开

  • $^
    所有不重复的依赖文件,以空格分开

  • $%
    如果目标是归档成员,则该变量表示目标的归档成员名称

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值