为什么makefile在手动删除目标文件时没有编译新库?

时间:2016-04-07 14:35:03

标签: makefile

我有一个特殊的用例,不知道它是否正确,或者我写错了makefile。 (我认为这完全没问题)

我有以下演示make文件来为我的AVR构建一个hex文件:

__CFILES := a.c b.c d.c
__OBJS := $(__CFILES:.c=.obj)
__LIB := path/to/demo/lib.a
# Dependency include 
-include $(__CFILES:.c=.d)
#################### Main Target ####################
all: $(__TARGET_HEX)
# Build hex file
$(__TARGET_HEX): $(__LIB)
     @echo *******************************************************************************
     @echo Link Libraries and generate HEX file.
     @echo *******************************************************************************
     $(DEMO COMMAND FOR LINKING ETC)

$(__LIB): $(__OBJS)
     @echo *******************************************************************************
     @echo Linking all objects and generate __LIB library.
     @echo *******************************************************************************
     $(COMMAND TO MAKE A LIBRARY FROM OBJs)

$(__OBJS):
    @echo Compiling $(@:.obj=.c)
    $(COMMAND TO COMPILE)

用例如下,当我从本地磁盘手动删除目标文件时,该过程什么都不做,只从旧库生成一个HEX文件。

如果我删除所有对象也使得同样的过程。

现在我更改了C文件的时间戳,然后我再次启动构建过程,然后对所有被删除的对象进行编译并生成一个新库。

我不知道它是否可以,但似乎只在更改源文件时生成新的lib,如果删除了目标文件则不生成任何内容。

有人能告诉我是否在语法上出错了吗?我认为这没有错,make文件非常聪明,可以识别何时构建新库,但我需要你的帮助才能更深入地了解正在发生的事情。

1 个答案:

答案 0 :(得分:0)

我找到了原因,我想解释一下,如果某人使用Target作为一个文件,比如一个lib,那么make文件会查看目标文件是否更新作为对象和所有C文件,如果它更新则没做什么。

如果目标是名称,例如lib,那么总是构建一个新库。举个例子!

__CFILES := a.c b.c d.c
__OBJS := $(__CFILES:.c=.obj)
__LIB := path/to/demo/lib.a
# Dependency include 
-include $(__CFILES:.c=.d)
#################### Main Target ####################
all: $(__TARGET_HEX)
# Build hex file
$(__TARGET_HEX): lib
    @echo     *******************************************************************************
     @echo Link Libraries and generate HEX file.
     @echo     *******************************************************************************
     $(DEMO COMMAND FOR LINKING ETC)

lib: $(__OBJS)
     @echo     *******************************************************************************
     @echo Linking all objects and generate __LIB library.
     @echo     *******************************************************************************
     $(COMMAND TO MAKE A LIBRARY FROM OBJs)

$(__OBJS):
    @echo Compiling $(@:.obj=.c)
    $(COMMAND TO COMPILE)