Makefile编译原理 make和makefile

一.make和makefile

如图所示,一个工程中的源文件不计其数,其按类型、功能、模块分别放在若干个目录中, Makefile 文件定义了一系列的规则来指定哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为 Makefile 文件就像一个 Shell 脚本一样,也可以执行操作系统的命令。

Makefile 带来的好处就是自动化编译,一旦写好,只需要一个 make 命令,整 个工程完全自动编译,极大的提高了软件开发的效率。

make是一个应用程序:

->解析源程序之间的依赖关系

->会执行宿主操作系统中的各种命令

makefile是一个描述文件:

->定义一系列的规则来指定源文件的先后顺序

->拥有特定的语法规则,支持函数定义和函数的调用

->能够直接集成操作系统的各种命令

make和makefile之间的关系:

makefile中描述用于指导make程序如何完成工作,make根据makefile中的规则执行命令,最后完成编译输出。

make的简写示例:

    make hello

功能说明:以hello关键字作为目标查找当前目录下的makefikr文件,并执行hello处的命令。

    make

功能说明:查找makefile文件中最顶层的目标,并执行最顶层的命令。

二.makefile的结构

初识makefile结构体:

hello.out all : func.o main.o
	gcc -o hello.out func.o main.o
	
func.o : func.c
	gcc -o func.o -c func.c
	
main.o : main.c
	gcc -o main.o -c main.c

注意:

1.如果只是修改了func.c 这里只会执行gcc -o func.o -c func.c和gcc -o hello.out func.o main.o

因为make检测到func.c更新了,而main.c没有更新,所以make只是执行了顶层的第一条依赖

func.o.

2.执行make的时候,make会去对比hello.out和当前目录下文件的文件有没有被修改,如果

hello.out是最新的,就不会去执行hello.out all。

三.伪目标的引入

默认的情况下:

->make认为目标对应着一个文件。

->make比较目标文件和依赖文件的新旧关系,决定是否执行命令。

makefile中的伪目标:

->通过.PHONY关键字声明一个伪目标

->伪目标不对应任何实际文件

->不管为目标的依赖是否更新,命令总是执行

hello.out all : func.o main.o
	gcc -o hello.out func.o main.o
	
func.o : func.c
	gcc -o func.o -c func.c
	
main.o : main.c
	gcc -o main.o -c main.c

.PHONY : clean

clean :
	rm *.o hello.out

伪目标的语法:先声明,后使用。