一、makefile 规则
1、如果没编译过,将所有的 (.c) 文件编译并且链接;
2、如果有其中的 (.c) 文件改变,编译并链接改变的文件;
3、如果(.h)文件被修改,编译引用相应的 (.c) 文件, 链接;
4、在随意修改时间的情况下,会导致编译过程中生成的 (.o 中间文件)与可执行文件时间不一致,此时会编译相应的文件,并链接,最终编译成可执行文件;
二、第一版 makefile:
例如有2个 .h 文件(utils.h, player.h, actor.h)和 3个 .c 文件( main.c, player.c, actor.c)需要编译链接:
/*****main.c*********/ #include "utils.h" #include "player.h" void main() { // do something }
/*******player.c**********/ #include "utils.h" #include "actor.h" bool create_player() { // do something }
/****actor.c************/ #include "utils.h" bool create_actor() { // do something }
/********* makefile *****************/ test : main.o actor.o cc -o test main.o actor.o main.o : main.c utils.h player.h actor.h cc -c main.c palyer.o: player.c player.h actor.h utils.h cc -o player.c actor.o: actor.h utils.h cc -o actor.c clean: rm test ain.o player.o actor.o
优点:可毒性很强,思路清晰 明了;
缺点:麻烦,重复的依赖过多,当需要编译大量文件时容易出错;
第二版:利用 makefile 的变量;
/********* makefile *****************/ obj = main.o actor.o // 跟第一版比较,唯一的区别在这 test : $(obj) // 这儿 cc -o $(obj) // 这儿 main.o : main.c utils.h player.h actor.h cc -c main.c palyer.o: player.c player.h actor.h utils.h cc -o player.c actor.o: actor.h utils.h cc -o actor.c clean: rm test ain.o player.o actor.o
原文:https://www.cnblogs.com/0x-1119/p/10620084.html