Makefile11--自动生成依赖关系(上)

本文探讨了Makefile中如何正确处理源文件与头文件的依赖关系,通过三个实验展示了预处理器的作用及如何确保编译过程能响应头文件的更改。

学习自狄泰软件学院唐佐临老师Makefile课程,文章中图片取自老师的PPT,仅用于个人笔记。


在这里插入图片描述

在这里插入图片描述
说明:编译器是如何编译源文件和头文件的? 首先出场的是预处理器,预处理器只是做一些简单的文本替换,其中的一个替换就是将 头文件中代码 直接插入到 源文件里面,因此 当后续的编译器出场的时候,就不会去理会.h 头文件了,只通过预处理后得到的源文件来产生目标文件。所以 我们在makefile中 仅仅以源文件作为目标的依赖,命令可能是无法执行的。

在这里插入图片描述

实验1

func.h

#ifndef FUNC_H
#define FUNC_H

#define HELLO "Hello D.T."

void foo();

#endif

func.c

#include "stdio.h"
#include "func.h"

void foo()
{
    printf("void foo() : %s\n", HELLO);
}

main.c

#include <stdio.h>
#include "func.h"

int main()
{
    foo();
	
    return 0;
}	

makefile

OBJS := func.o main.o

hello.out : $(OBJS)
	#链接
	@gcc -o $@ $^
	@echo "Target File ==> $@"
	
#通过 规则中的模式替换  为  func.o main.o 和两个目标生成真真正正的规则。
$(OBJS) : %.o : %.c
	#编译
	@gcc -o $@ -c $^



mhr@ubuntu:~/work/makefile1$ make
Target File ==> hello.out
mhr@ubuntu:~/work/makefile1$ 

实验2 :修改 func.h头文件,makefile中的目标不会被执行

#ifndef FUNC_H
#define FUNC_H

#define HELLO "Hello makefile"

void foo();

#endif

mhr@ubuntu:~/work/makefile1$ make
make: 'hello.out' is up to date.
mhr@ubuntu:~/work/makefile1$ 

居然没有发生变化!并不是我们期望的 Hello makefile。为什么?因为这个makefile 并没有考虑目标文件对头文件的间接依赖,所以说 就算改动了头文件,make 也不知道,makefile 中描述的规则只会去查看源文件是否比目标文件更新,结果源文件没改动,所以不会重新编译。

实验3 :修改 makefiel ,直接在makefile中添加 func.h 依赖

OBJS := func.o main.o

hello.out : $(OBJS)
	@gcc -o $@ $^
	@echo "Target File ==> $@"
	
$(OBJS) : %.o : %.c func.h
	@gcc -o $@ -c $<



mhr@ubuntu:~/work/makefile1$ make
Target File ==> hello.out
mhr@ubuntu:~/work/makefile1$ 

直接在makefile中添加 func.h 依赖,这样一来,通过上面模式规则所生成的真正规则当中,每一个.o 文件都会依赖到 .h 头文件。

弊端

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Ma浩然

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值