我有一个特殊的用例,不知道它是否正确,或者我写错了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文件非常聪明,可以识别何时构建新库,但我需要你的帮助才能更深入地了解正在发生的事情。
答案 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)