日期:2014-05-16  浏览次数:20830 次

obj目录与源文件目录不同是,怎么变形makfile文件
本帖最后由 lzp5115 于 2012-11-21 20:39:51 编辑
各位大神,
现在要编写一个makefile文件,src目录和obj目录是分开的,在这个makefile中,以后只需要修改SRC中的值
SRC=a.c \
b.c \
c.c
(添加或删除.c文件),就可以想要的生成目标文件。
现在我写了下面这个makefile,可以实现这个要求,但觉得这方法不好,makefile如下:



######## makefile##########
#源文件
SRC=a.c \
        b.c \
        c.c

#.o文件
OBJ=$(SRC:.c=.o)

#设置.c文件的查找路径
VPATH=../src

#加了路径的obj路径:./obj/a.c ./obj/b.c ./obj/c.c
PATH_OBJ=$(OBJ:%=obj/%)

#生成目标
$(LIBTARGET):$(OBJ)
      $(ARCHIVER) $(ARCHIVE_OPTION) $(PATH_OBJ)

#生成OBJ
$(OBJ):%.o:%.c
      $(COMPILER) $(COMPILE_OPTION) $< -o obj/$@

##############makefile 结束#####################################


使用此文件,每次都会将OBJ重新生成,因为
$(LIBTARGET):$(OBJ)
      $(ARCHIVER) $(ARCHIVE_OPTION) $(PATH_OBJ)
这个之中的$(OBJ),与
$(OBJ):%.o:%.c
      $(COMPILER) $(COMPILE_OPTION) $< -o obj/$@
这语句生成的 obj/$@ 这个不同,它们并不在一个目录,这样每次运行makefile他们都会重新生成。请问有什么好的方法,将$(LIBTARGET) 与 obj/$(OBJ)关联起来吗?

------解决方案--------------------
SRC=a.c \
        b.c \
        c.c
PATH_SRC=$(SRC:%=src/%)
OBJ=$(SRC:.c=.o)
PATH_OBJ=$(OBJ:%=obj/%)
$(LIBTARGET):$(PATH_OBJ)
      $(ARCHIVER) $(ARCHIVE_OPTION) $(PATH_OBJ)
$(PATH_OBJ):$(PATH_SRC)
      $(COMPILER) $(COMPILE_OPTION) $< -o $@
------解决方案--------------------
引用:
果然,
$(LIBTARGET):$(PATH_OBJ)
这条语句它会自动一个一个的匹配,这个应该是makefile的隐含规则吧?

这属于依赖关系,LIBTARGET依赖于PATH_OBJ
所以每次make時,都會一个个检查PATH_OBJ中的文件是否比LIBTARGET新,如新,则重新生成
你之前用的OBJ会导致,他在当前目录检测不到文件,所以每次都重新生成
OBJ与SRC也是同理
------解决方案--------------------
直接用模板吧
这是网上找的,我就用的这个
http://www.iteye.com/topic/774919