Makefile教程(三)

自动生成依赖性

应用场景:头文件更新了 如何让源文件也自动更新

目录结构

在这里插入图片描述
直接编译的话 会报错 找不到头文件
所以这里通过 -I指定头文件路径 或者 在#include “head/head.h”

gcc *.c -I./head
TGT = a.out
SRCS = main.c test.c foo.c

#CROSS_COMPILE = arm-linux-genuabihf-
CC = $(CROSS_COMPILE)gcc
CFLAGS = -I$(HEAD_PATH)

CUR_PATH = $(shell pwd)
HEAD_PATH = $(CUR_PATH)/head

$(TGT): $(SRCS:.c=.o)
	$(CC) $^ $(CFLAGS) -o $@

%.o: %.c
	$(CC) -c $<

%.d: %.c
	$(CC) -MM $< > $@
sinclude $(SRCS:.c=.d)

clean:
	rm -vf $(TGT) $(SRCS:.c=.o) $(SRCS:.c=.d) 

分析:
把文件所需的依赖,全部写在Makefile中,如果某个依赖更新了,那么对应的目标肯定也会更新。
命令 $(CC) -MM $< > $@ 会将当前路径下的所有.c的依赖输出到文件%.d中去,然后sinclude把所有的.d文件的内容加载进来,

%.d: %.c
	$(CC) -MM $< > $@
main.o: main.c head/head.h
test.o: test.c
foo.o: foo.c

所以,当依赖比目标更新的时候,自然就引发目标的重新编译了

输出结果:
zys@ubuntu:~/linux/application/makefile/p5$ make
gcc -MM foo.c > foo.d
gcc -MM test.c > test.d
gcc -MM main.c > main.d
gcc -c main.c
gcc -c test.c
gcc -c foo.c
gcc main.o test.o foo.o -I/home/zys/linux/application/makefile/p5/head -o a.out

思考

可以看到输出结果是先输出.d 再输出.o。
如果把$(CC) -c $< 和 $(CC) -MM $< > $@交换下位置 会不会先输出.o呢

TGT = a.out
SRCS = main.c test.c foo.c

#CROSS_COMPILE = arm-linux-genuabihf-
CC = $(CROSS_COMPILE)gcc
CFLAGS = -I$(HEAD_PATH)

CUR_PATH = $(shell pwd)
HEAD_PATH = $(CUR_PATH)/head

$(TGT): $(SRCS:.c=.o)
	$(CC) $^ $(CFLAGS) -o $@ 

%.d: %.c
	$(CC) -MM $< > $@
sinclude $(SRCS:.c=.d)

%.o: %.c
	$(CC) -c $< 

clean:
	rm -vf $(TGT) $(SRCS:.c=.o) $(SRCS:.c=.d) 

.PHONY: clean

输出结果:
gcc -MM foo.c > foo.d
gcc -MM test.c > test.d
gcc -MM main.c > main.d
gcc -c main.c
gcc -c test.c
gcc -c foo.c
gcc main.o test.o foo.o -I/home/zys/linux/application/makefile/p5/head -o a.out

输出结果仍然是.d再前 由此看来,输出结果跟命令的先后顺序无关

疑问:
在这里插入图片描述
执行过程:1-2-3
.d为啥为生成呢 什么时候生成

伪目标

不是一个真正的目标,仅仅是为了执行其所在的规则下面的命令,不应该让make来判断它是否存在,或者是否应该被生成。
.PHONY clean
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值