Makefile初识

目标文件:依赖条件

 [TAB键]  命令

main:main.o input.o calcu.o
    gcc -o main main.o input.o calcu.o
main.o:main.c
    gcc -c main.c
input.o:input.c
    gcc -c input.c
calcu.o:calcu.c
    gcc -c calcu.c

clean:
    rm *.o
    rm main

变量

#定义一个变量objects
objects = main.o input.o calcu.o

#使用变量objects,用$(变量名)

main:$(objects)
    gcc -o main $(objects)

main.o:main.c
    gcc -c main.c
input.o:input.c
    gcc -c input.c
calcu.o:calcu.c
    gcc -c calcu.c

clean:
    rm *.c
    rm main

赋值符“=”

name = wxy
curname = $(name)
name = wxyy123

print:
    @echo curname: $(curname)

make print 打印wxyy123 为所赋值变量的最后的值

赋值符“=”借助另外一个变量,可以将变量的真实值推到后面去定义,也就是变量的真实值取决于他所引用的变量的最后一次有效值。

赋值符“:=”

name = wxy
curname := $(name)
name = wxyy123

print:
    @echo curname: $(curname)

make print 打印 wxy 

赋值符":="不会使用后面定义的变量,只能使用前面已经定义好的

赋值符"?="

curname ?= wxy

上述代码的意思是,如果变量curname前面没有被赋值,那么变量就是wxy,如果前面已经赋过值,那么就使用前面赋的值

curname = wxyy123
curname ?= wxy

print:
    @echo curname: $(curname)

变量追加"+="

objects = main.o input.o
objects += calcu.o

Makefie的模式规则:

% 表示对文件名的匹配,%表示长度任意的非空字符串,比如"%.c"就是所有以.c结尾的文件,再比如a.%.c就表示以a.开头,以.c结束的所有文件

%.o:%.c
    #命令

之前的Makefile简化:

objects = main.o input.o calcu.o
main:$(objects)
    gcc -o main $(objects)
%.o:%.c
    #命令

clean:
    rm *.o
    rm main

Makefile自动化变量:

常用三种:$@、$<、$^

$@规则中的目标集合,在规则模式中,如果有多个目标的话,"$@"表示匹配模式中定义的目标集合。
$<依赖文件集合中的第一个文件,如果依赖文件是以模式(即"%")定义的,那么“$<”就是符合模式的一系列的文件集合
$^所有依赖文件的集合,使用空格分开,如果在依赖文件中有多个重复文件,$^会去除重复的依赖文件,值保留一份

上述Makefile补充为:

objects = main.o input.o calcu.o
main:$(objects)
    gcc -o main $(objects)
%.o:%.c
    gcc -c $<

clean:
    rm *.o
    rm main

Makefile伪目标

使用伪目标是为了避免Makefile中定义的只执行命令的目标和工作目录下的实际文件出现名字冲突。为了避免文件夹中存在clean文件,导致目标被认为是最新的,我们可以将clean声明为伪目标,如下:

.PHONY:clean

Makefile的条件判断:暂略

ifeq、ifneq、ifdef、ifndef......

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值