это не работает:Производитель: удалить цель, прежде чем сделать целевой
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 '.
Спасибо, Etan. Итак, верно следующее:? В разделе $ (TARGET): $ (OBJ) у вас есть только правила, связанные с обновлением $ (OBJ), а не $ (TARGET)? – Sequoia
Ударьте это. Я нашел это. Вы должны изменить внутренности Sfe.cpp, чтобы заставить timestamp указывать, что Sfe.cpp is! Старее и, следовательно, свежее! чем Sfe.exe. Если это так, то !! все вещи под $ (TARGET): $ (OBJS). – Sequoia
make rebuilds target, если какие-либо предпосылки рассматриваются как более новые, правильные. И нет, цели всегда должны создавать точное имя файла цели. Использование '$ @' для этой цели обычно является хорошей идеей. И да, вы всегда можете заставить предварительное условие быть новее, или вы можете использовать методы в ответе, чтобы сделать аналогичную вещь, не изменяя время модификации произвольных файлов предварительных условий. –