Makefile工作原理
基本原则
- 若想生成目标,检查规则中的所有的依赖文件是否都存在;
- 如果有的依赖文件不存在,则向下搜索规则,看是否有生成该依赖文件的规则;
如果有规则用来生成该依赖文件,则执行规则中的命令生成依赖文件;
如果没有规则用来生成该依赖文件,则报错。
- 如果所有依赖都存在,检查规则中的目标是否需要更新,必须先检查它的所有依赖,依赖中有任何一个被更新,则目标必须更新。(检查的规则是哪个时间大哪个最新)
若目标的时间 > 依赖的时间,不更新
若目标的时间 < 依赖的时间,则更新
总结
- 分析各个目标和依赖之间的关系
- 根据依赖关系自底向上执行命令
- 根据依赖文件的时间和目标文件的时间确定是否需要更新
- 如果目标不依赖任何条件,则执行对应命令,以示更新(如:伪目标)
实例
第二个版本:
makefile
# 默认目标
all: main
# main依赖于main.o和add.o
main: main.o add.o
gcc main.o add.o -o main
# main.o依赖于main.c
main.o: main.c
gcc -c main.c -I ./ -o main.o
# add.o依赖于add.c
add.o: add.c
gcc -c add.c -I ./ -o add.o
c
#include "add.h"
#include <stdio.h>
int main(void) {
printf("%d\n", add(10, 20));
return 0;
}
c
#ifndef __SYSS_ADD_H__
#define __SYSS_ADD_H__
int add(int a, int b);
#endif //__SYSS_ADD_H__
c
#include "add.h"
int add(int a, int b) {
return a + b;
}
执行make
缺点:冗余,若 .c
文件数量很多,编写起来比较麻烦。