Skip to content

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 文件数量很多,编写起来比较麻烦。