【发布时间】:2014-04-27 11:26:18
【问题描述】:
我刚刚回到 Makefile 世界,遇到了一个令人烦恼的问题:在生成相应 .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 总是以“没有什么可以为'所有'做响应”但是如果我更改如下规则:
$(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 更新,则 foo.cpp 不会被重新编译。
FWIW,我已验证 $(INCLUDE_DIR)/$*.h 扩展为正确的文件名。
我很确定这是显而易见的。有什么提示吗?
【问题讨论】:
标签: makefile