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

学习自狄泰软件学院唐佐临老师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 头文件。

弊端

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

发布了192 篇原创文章 · 获赞 100 · 访问量 8万+

猜你喜欢

转载自blog.csdn.net/LinuxArmbiggod/article/details/103737496