LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 776|回复: 3

请教个makefile的问题

[复制链接]
发表于 2007-6-20 10:37:00 | 显示全部楼层 |阅读模式
在一个工程中,我一般用%.o:%.c的模式规则生成.o文件,这样一来导致makefile人为.c文件只是依赖响应的.c文件。而实际上,.c文件一般还依赖它所包括大一些头文件。所以这样写的话,当只有其所包含大头文件发生了变化,这个.o文件是不会被重新生成的。
gcc中有-MM选项可以输出文件的依赖关系到一个文件中,然后把这个文件include进来作为.o文件的生成规则。这样的话,头文件改变相应的.o文件不被生成这个错误是被改掉了,但导致的问题是编译一个工程要分两步执行,先make dep生成依赖关系,然后再make才不会出错。
这个在开发过程中很不方便。大家有没有更好的办法?
发表于 2007-6-20 11:40:33 | 显示全部楼层
我没太明白楼主的意思,不过按照最后两句话所描述的,只要让 all 依赖于 dep 不就行了么

在 all 的依赖中加上 dep
  1. all: dep xxx
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-20 13:45:14 | 显示全部楼层
我贴。后来还发现一个问题。就是在生成.o文件的过程中,我的CFLAGS加不进去了。楼上的说的有一定道理。我再改改。

  1. include $(TOPDIR)/build/toolchain.mak
  2. SRCS = $(wildcard *.c)
  3. OBJS = $(patsubst %.c,%.o,$(SRCS))
  4. OBDS = $(patsubst %.c,%.d,$(SRCS))

  5. all:test
  6. -include $(OBDS)

  7. test:$(OBJS)
  8.     $(LD) $(LDFLAGS) $^ -o $@

  9. %.d:%.c
  10.     $(CC) -MM $(CFLAGS) $< > $@;     

  11. #%.o:%.c
  12.     #$(CC) $(CFLAGS) -c $^

  13. clean:
  14.     rm -f *.o *.d*

  15. dep:$(OBDS)
  16.     @echo '$(OBDS)'
复制代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2007-6-21 10:07:14 | 显示全部楼层
改好了.这样写即使只有头文件发生变化,相应的.o文件还是会被重新生成。这在大一点工程文件的编译中还是比较有用的。大致摸板:

  1. CC = gcc
  2. LD = gcc
  3. CFLAGS = -I../include

  4. SRCS = $(wildcard *.c)
  5. OBJS = $(patsubst %.c,%.o,$(SRCS))
  6. OBDS = $(patsubst %.c,%.d,$(SRCS))

  7. all:dep test
  8. -include $(OBDS)

  9. test:$(OBJS)
  10.     $(LD) $(LDFLAGS) $^ -o $@

  11. %.d:%.c
  12.     @set -e; rm -f $@;\
  13.     $(CC) -MM $(CFLAGS) $< > $@.$$$$; \
  14.     sed -e 'a \\t$(CC) $(CFLAGS) -c $<' $@.$$$$ > $@; \
  15.     rm -f $@.$$$$

  16. clean:
  17.     rm -f *.o *.d*

  18. dep:$(OBDS)
  19.     #@echo '$(OBDS)'

复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表