添加先决条件会导致"nothing to be done for 'all'"



我刚刚回到Makefiles的世界,遇到了一个棘手的问题:在生成相应.o文件的规则上添加$*.h先决条件总是,结果是"什么都没做"。以下是我的Makefile全文:

SOURCES := mu.cpp node.cpp test_node.cpp transport.cpp
OBJECT_DIR := ../obj
INCLUDE_DIR := ../include
OBJECTS := $(patsubst %.cpp,$(OBJECT_DIR)/%.o,$(SOURCES))
CC      = g++
DEFS    = 
CFLAGS  = -O3 -Wall
IFLAGS  = -I$(INCLUDE_DIR) -I../tarballs/stk-4.4.4/include
$(OBJECT_DIR)/%.o : %.cpp $(INCLUDE_DIR)/mu.h $(INCLUDE_DIR)/$*.h 
        $(CC) $(CFLAGS) $(IFLAGS) -c $(<) -o $@
all: $(OBJECTS)
clean:
        rm -f $(OBJECT_DIR)/*.o
$(OBJECTS): | $(OBJECT_DIR)
$(OBJECT_DIR):
        mkdir $(OBJECT_DIR)

如果我使用上面的方法键入make all,make总是以"对‘all’不做任何事情"作为响应,但如果我更改规则,则为:

$(OBJECT_DIR)/%.o : %.cpp $(INCLUDE_DIR)/mu.h $(INCLUDE_DIR)/$*.h 

$(OBJECT_DIR)/%.o : %.cpp $(INCLUDE_DIR)/mu.h

(即,我删除了foo.cpp对../include/foo.h的依赖),然后make all按预期进行响应。当然,这样做的问题是,如果/include/foo.h比foo.cpp.最近进行了修改

FWIW,我已经验证了$(INCLUDE_DIR)/$*.h扩展到正确的文件名。

我确信这是显而易见的。有什么提示吗?

$*这样的自动变量除了在规则的配方中之外,不会在任何地方定义。您不能在必备组件列表中使用它们。

为什么不在这两种情况下都使用模式呢?

$(OBJECT_DIR)/%.o : %.cpp $(INCLUDE_DIR)/%.h $(INCLUDE_DIR)/mu.h

最新更新