2014-08-26 5 views
1

это не работает:Производитель: удалить цель, прежде чем сделать целевой

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

сделать только перестроить вещи, которые необходимо перестроить. Он определяет, что с временными отметками предпосылок цели. В вашем первом примере предположительно файлы в $(OBJS) уже старше двоичного кода в $(TARGET), и поэтому make не считает, что ему что-то нужно делать.

В вашем втором примере цель all не имеет предпосылок и, как таковая, всегда считается необходимой для ее построения.

Лучшим решением может быть либо установка $(TARGET) цели как .PHONY в вашем первом примере (см. this section руководства GNU для получения дополнительной информации о фишинговых целях).

В качестве альтернативы вы можете использовать force target для выполнения аналогичной задачи (но без некоторых побочных эффектов .PHONY). Дополнительную информацию об этом см. В разделе this section руководства GNU Make Manual.

+0

Спасибо, Etan. Итак, верно следующее:? В разделе $ (TARGET): $ (OBJ) у вас есть только правила, связанные с обновлением $ (OBJ), а не $ (TARGET)? – Sequoia

+0

Ударьте это. Я нашел это. Вы должны изменить внутренности Sfe.cpp, чтобы заставить timestamp указывать, что Sfe.cpp is! Старее и, следовательно, свежее! чем Sfe.exe. Если это так, то !! все вещи под $ (TARGET): $ (OBJS). – Sequoia

+0

make rebuilds target, если какие-либо предпосылки рассматриваются как более новые, правильные. И нет, цели всегда должны создавать точное имя файла цели. Использование '$ @' для этой цели обычно является хорошей идеей. И да, вы всегда можете заставить предварительное условие быть новее, или вы можете использовать методы в ответе, чтобы сделать аналогичную вещь, не изменяя время модификации произвольных файлов предварительных условий. –

Смежные вопросы