介绍:编译大型项目时,有很多目标文件、库文件、头文件和最终可执行文件,而又不同文件存在依赖关系。
eg.可执行文件helloworld依赖于test.o进行编译, test.o依赖于test.c
$gcc -c -o test.o test.c $gcc -o helloworld test.o
UNIX系统下make工具可自动记录和处理文件间依赖关系,避免手动输入大量gcc命令,调用make自动编译
依赖关系记录在Makefile中,从上往下找到编译某文件所需的所有依赖关系,再自下而上编译
eg.下面代码保存为test.c
#include<stdio> /* *makefile演示 */ int main() { printf("Hello world!\n"); return 0; }
下面代码保存为Makefile
#helloworld是可执行文件 helloworld: test.o echo "good" gcc -o helloworld test.o test.o: test.c gcc -c -o test.o test.c
#后为注释
●目标文件(target)依赖于前提文件(prerequisite)【可有多个前提文件,前提文件之间要用空格分开】
●依赖关系后<Tab>缩进行是实现依赖关系进行的操作,即正常的UNIX命令。一个依赖关系可附多个操作。
换言之
●要helloworld必须有test.o,并执行附属操作。
●没有test.o,必须搜索其他依赖关系,并创建test.o。
创建helloworld,用make命令(其 执行 为递归过程)
$make helloworld
实线:依赖关系,虚线:依赖关系检索过程
if 当前依赖关系中没有说明前提文件, then 直接执行操作
if 当前依赖关系说明了目标文件,而目标文件所需的前提文件已经存在,而且前提文件与上次make时一样, then 直接执行该依赖关系的操作
if 当前目标文件依赖关系所需的前提文件不存在,或者前提文件发生改变,那么以前提文件为新的目标文件,寻找依赖关系,创建目标文件