Makefile简介

gcc编译

基本规则

预处理、编译、汇编、链接

gcc -o test a.c b.c		#生成test可执行文件

先预处理、编译、汇编,再链接

gcc -c -o a.o a.c
gcc -c -o b.o b.c
gcc -o test a.o b.o
命令

-MF -MD:将依赖写入到指定文件

gcc -c -o c.o c.c -MF -MD c.d		#编译c.o, 并将c.c的依赖写入到c.d

-CFLAGS:编译参数,[-D]添加宏定义,[-Werror]将编译警告转为报错,[-I]指定默认头文件路径

CFLAGS:-DDEF -IINC -Werror

gcc -o test a.c a.o -CFLAGS

makefile基本语法

基本规则

若依赖文件比目标文件新,或者目标文件不存在,则执行命令
若make后不加参数,默认执行第一个目标

目标文件:依赖文件
	命令
test:a.o b.o
	gcc -o test a.o a.o
a.o:a.c
	gcc -c -o a.o a.c
b.o:b.c
	gcc -c -o b.o b.c
通配符

$@:目标
$<:首个依赖文件
$^:所有依赖文件

test:a.o b.o
	gcc -o test $^
%.o:%.c
	gcc -o -c $@ $<
假想目标

若当前路径下存在名字为clean的文件,执行make clean命令时,根据makefile规则只有当文件不存在时才会执行,因此若没有使用假想目标,makefile就不会执行clean对应的命令,所以需要假想目标

.PHONY:clean

clean:
	rm	*.o test
变量
A := xxx		#A的值在定义时即确定
A = xxx		#A的值会在使用的时候才确定,即A的值时对文件中所有对A值处理后的结果
A ?= xxx	#如果之前没有定义过当前赋值才起作用,相当于默认值
A += xxx	#在原来基础上追加
函数
A = $(foreach f, $(list), opt)		#遍历list的值到f,对每个f值做opt操作
B = $(filter %t, $(list))	#从list列表中,取出不符合t格式的变量
C = $(filter-out %t, $(list))	#从list列表中,取出不符合t格式的变量
D = $(wildcard *.t)	#找出当前路径中.t格式的文件
E = $(patsubst %t, %replace, $(list))	#从list列表中,将符合t格式的变量替换成replace格式
实例分析
objs = a.o b.o c.o

dep_files := $(patsubst %,.%.d, $(objs))
dep_files := $(wildcard $(dep_files)

CFLAGS = -Werror -Iinclude

test: $(objs)
	gcc -o test $^

ifneq ($(dep_files),)
include $(dep_files)
endif

%.o : %.c
	gcc $(CFLAGS) -c -o $@ $< -MD -MF .$@.d

clean:
	rm *.o test

distclean:
	rm $(dep_files)
	
.PHONY: clean	

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值