Chinaunix首页 | 论坛 | 博客
  • 博客访问: 650697
  • 博文数量: 90
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 2018
  • 用 户 组: 普通用户
  • 注册时间: 2007-03-03 13:09
文章分类

全部博文(90)

文章存档

2010年(7)

2009年(23)

2008年(60)

我的朋友

分类: LINUX

2009-11-14 21:20:22

    由于目前做的这个项目中,基于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内容:

main.o main.d:main.c a.h


如果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) |
给主人留下些什么吧!~~