Makefile基础

发布时间 2023-07-12 21:24:54作者: asandstar

介绍:编译大型项目时,有很多目标文件、库文件、头文件和最终可执行文件,而又不同文件存在依赖关系。

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 当前目标文件依赖关系所需的前提文件不存在,或者前提文件发生改变,那么以前提文件为新的目标文件寻找依赖关系,创建目标文件