一.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
伪目标的语法:先声明,后使用。