我刚刚回到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