这不起作用:
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'做的。
答案 0 :(得分:0)
make只重建需要重建的东西。它根据目标的先决条件的时间戳确定。在您的第一个示例中,大概$(OBJS)
中的文件已经比$(TARGET)
中的二进制文件旧了,因此make并不相信它有任何事情要做。
在您的第二个示例中,all
目标没有先决条件,因此始终被视为需要构建。
更好的解决方案可能是在第一个示例中将$(TARGET)
目标设置为.PHONY
(有关Phony Targets的更多信息,请参阅GNU制作手册的this section)。
或者,您可以使用force target
执行类似的任务(但没有一些.PHONY
副作用)。有关详细信息,请参阅GNU制作手册的this section。