【问题标题】:adding a prerequisite results in "nothing to be done for 'all'"添加先决条件会导致“对‘所有’都无能为力”
【发布时间】: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


    【解决方案1】:

    像$* 这样的自动变量不会在任何地方定义,除非在规则的配方中。您不能在先决条件列表中使用它们。

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

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

    【讨论】:

    • “像 $* 这样的自动变量没有在任何地方定义,除非在规则的配方中。”嗯,这是一些智慧,可以节省我几个小时的挠头。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 2017-05-27
    • 1970-01-01
    相关资源
    最近更新 更多