关于makefile

makefile功能

make工具最主要的功能就是通过编写makefile文件来描述源程序之间相互关系,并且自动维护编译工作
在UNIX系统中习惯使用Makefile作为makefile文件,如果要使用其他文件,例如libXXXX.mk就需要通过参数-f来指定我们的makefile文件

make -f libXXXX.mk

书写规则(依赖关系、生成目标方法)

targets:prerequistes
	command

例如:

main:main.c
	gcc main.c -o main

targets是我们最终想要得到的目标文件名
command是得到最终文件所需要执行的命令
prerequistes是获取目标文件的先决条件(源文件)

如果我们想定义一系列比较类似的文件就可以使用通配符例如:

clean:
	rm -f *.o
clean:
	cat main.c
	rm -f *.o

wildcard和patsubst

如果使用通配符表示一系列文件并且赋值给变量例如

object = *.c

object的值将会是*.c,并不会是*.c文件的展开,如果需要表示.c文件基于需要使用wildcard函数这样就能使object表示为.c文件的名的集合

object = ${wildcard *.c}

而patsubst的名称为模式字符串替换函数

${patsubst <pattern>, <replacement>, <text>}

含义为在<text>中单词(以空格、换行、tab分隔)是否符合模式<pattern>如果模式匹配就使用<replacement>替换(可以包含通配符%)

src = ${wildcard *.c}
obj = ${patsubst %.c, %.o, ${src}}

伪目标

clean:
	rm -f *.o

伪目标不是一个文件,只是一个标签,所以make无法生成它的依赖关系和是否执行,我们只有显示的指明这个目标才能让其生效,为了避免和文件重名我们可以使用一个特殊符号.PHONY来显式指明一个目标就是伪目标,向make说明不管是否有这个文件这个目标就是伪目标,只要有这个声明不管是否有这个文件要运行clean就可以make clean使用

.PHONY : clean
clean :
	rm *.o temp

变量和自动变量

在makefile中变量用作$(obj)(常用)或${obj}, #表示注释
$@:在规则命令中,表示规则中的目标
$^:在规则命令中,表示所有依赖条件
$<:在规则命令中,第一个依赖条件(如果应用在模式规则中,可以将依赖条件列表中的依赖依次取出,套用模式规则)

main:main.c
	gcc main.c -o main
main:main.c
	gcc main.c -o $@
main:main.c
	gcc $^ -o $@
main:main.c
	gcc $< -o $@
ALL:main
WALL = -Wall
CC = gcc
src = $(wildcard *.c)
obj = $(patsubst %.c, %.o, $(src))
main:$(obj)
	$(CC) $^ -o $@ $(WALL)
%.o:%.c
	$(CC) -c $< -o $@
.PHONY:clean
clean:
	rm -rf *.o main
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值