制作:在制作目标之前删除目标

时间:2014-08-26 08:41:17

标签: makefile rm

这不起作用:

CXXFLAGS =  -O2 -g -Wall -fmessage-length=0
OBJS =      src\Sfe.cpp
LIBS =
TARGET =      Sfe.exe

$(TARGET):  $(OBJS)
    rm -f $(TARGET)
    $(CXX) -o $(TARGET) $(OBJS) $(LIBS)

all: $(TARGET)
clean: rm -f $(OBJS) $(TARGET)

但这有效:

OBJS =      src\Sfe.cpp
LIBS =
TARGET =      Sfe.exe

$(TARGET):  $(OBJS)
    $(CXX) -o $(TARGET) $(OBJS) $(LIBS)

all: 
    rm -f $(TARGET)
    $(CXX) -o $(TARGET) $(OBJS) $(LIBS)
clean: rm -f $(OBJS) $(TARGET)

我想在编译新的之前删除Sfe.exe。 为什么第一种方式不起作用? 它始终以make回答:没有什么可以为'all'做的。

1 个答案:

答案 0 :(得分:0)

make只重建需要重建的东西。它根据目标的先决条件的时间戳确定。在您的第一个示例中,大概$(OBJS)中的文件已经比$(TARGET)中的二进制文件旧了,因此make并不相信它有任何事情要做。

在您的第二个示例中,all目标没有先决条件,因此始终被视为需要构建。

更好的解决方案可能是在第一个示例中将$(TARGET)目标设置为.PHONY(有关Phony Targets的更多信息,请参阅GNU制作手册的this section)。

或者,您可以使用force target执行类似的任务(但没有一些.PHONY副作用)。有关详细信息,请参阅GNU制作手册的this section