由于目前做的这个项目中,基于makefile的一套东西做的不好,我需要把它带到正规上来,所以才有了时间来好好研究makefile这一块,其中关于自动产生头文件这一块感觉非常好,对项目帮助也非常大,我来剖析这一用法。
如果不用自动产生依赖,那么如下:
main.c
#include"a.h"
int main(void){
printf("hello word,makefile\n");
return 0;
}
|
makefile 如下:
all:main.o
main.o:main.c a.h
$(CC) $(CPPFLAGS) -o $@ $^
|
这样如果a.h改变的话,makefile会自动重新编译产生.o文件。在项目小的时候,这样做是"可行的",但是随着项目规模非常大的时候,如果你新增加一个头文件,你需要修改makefile把它添加进来,这样就比较难以维护了,但是makefile提供了自动依赖,给我们带来了大大的便利。
新的makefile写法
参考
sources = main.c
%.o %.d: %.c
@set -e; rm -f $@; \
$(CC) -MM $(CPPFLAGS) $< > $@.$$$$; \
sed 's,\($*\)\.o[ :]*,\1.o $@ : ,g' < $@.$$$$ > $@; \
rm -f $@.$$$$
include $(sources:.c=.d)
|
这样就通过.d文件把依赖性给全部自动解决了。
main.d内容:
如果a.h 又include一个头文件b.h,那么传统的方法已经感知不到了,这里通过下面方法来解决:
a.h变了,那么需要重新生成 main.d文件,所以此时main.d文件就变成了:
main.o main.d:main.c a.h b.h
|
这时候main.o就依赖了b.h
阅读(4906) | 评论(0) | 转发(4) |