简单了解makefile
制作makefile
main.c
#include "mytool1.h"
#include "mytool2.h"
int main(){
mytool1_print("hello mytool1!");
mytool2_print("hello mytool2!");
return 0;
}
mytool1.c
#include "mytool1.h"
#include <stdio.h>
void mytool1_print(char *print_str){
printf("This is mytool1 print:%s",print_str);
}
mytool1.h
#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char *print_str);
#endif
mytool2.c
#include "mytool2.h"
#include <stdio.h>
void mytool1_print(char *print_str){
printf("This is mytool1 print:%s",print_str);
}
mytool2.h
#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char *print_str);
#endif
Makefile
简单的makefile
main : main.c mytool1.c mytool2.c mytool1.h mytool2.h
gcc -o main $^
$<:第一个依赖文件
$@:目标
$^:所有不重复的依赖文件,以空格分开
任何文件只要稍微做了修改就需要整个项目完整的重要编译。
生成中间文件的makefile
main : main.o mytool1.o mytool2.o
gcc -o main main.o mytool1.o mytool2.o
main.o : main.c mytool1.h mytool2.h
gcc -c main.c
mytool1.o : mytool1.c mytool1.h
gcc -c mytool1.c
mytool2.o : mytool2.c mytool2.h
gcc -c mytool2.c
.PHONY : clean
clean :
rm -rf *.o
只对修改过的文件进行重新编译
测试:
1. Makefile中交换main.o与mytool1.o之间的位置
总的编译执行顺序还是一样。
2. 修改makefile第一条关系
结论:makefile的第一条关系是makefile的最终目标,生成最终目标之后,makefile就结束了
makefile执行顺序的理解
makefile第一条命令是“最终目标”。根据最终目标的依赖,找到源头(堆栈),然后判断是否需要重新编译(出栈)。
如: A依赖B,B依赖C
A->B->C
那么,makefile根据依赖,建立依赖关系链表。先判断B是否需要重新编译(C是否更改),然后再判断A。
对于上面例子,建立了如下的关系: