2013-09-28 2 views
1

Мой make-файл не будет проверять, были ли какие-либо обновления и компилируется только в том случае, если в него добавлено более одного исходного файла. Он отлично работает только с одним исходным файлом ,Makefile не проверяет, обновляется ли и компилируется в любом случае

Кажется, что это любой исходный файл, который не указан как первый, всегда будет перекомпилирован и связан.

SOURCES=myclass.cpp mylock.cpp 
EXECUTABLE=locktest 
LIBRARIES=-pthread 
CFLAGS=-Wall 
CXX=g++ 
DIR=host/ 
EXE=$(EXECUTABLE) 

OBJECTS=$(SOURCES:%.cpp=$(DIR)%.o) 

$(EXE): $(OBJECTS) 
    $(CXX) -o [email protected] $(OBJECTS) $(LIBRARIES) 

$(DIR)%.o: %.cpp $(DIR) 
    $(CXX) $(CFLAGS) -c $< -o [email protected] 

$(DIR): 
    @mkdir $(DIR) 

clean: 
    @rm $(OBJECTS) $(EXE) 
    @rmdir $(DIR) 

Выход показывает проблема:

[email protected]:~/Desktop/Locktest$ make 
g++ -Wall -c myclass.cpp -o host/myclass.o 
g++ -Wall -c mylock.cpp -o host/mylock.o 
g++ -o locktest host/myclass.o host/mylock.o -pthread 
[email protected]:~/Desktop/Locktest$ make 
g++ -Wall -c myclass.cpp -o host/myclass.o 
g++ -o locktest host/myclass.o host/mylock.o -pthread 

ответ

1

Как @lijat указывает, когда вы создаете объект в $(DIR), операционная система обновляет время модификации каталога, так что в этом правиле:

$(DIR)%.o: %.cpp $(DIR) 
    ... 

предпосылкой $(DIR) всегда будет казаться чем любая цель, кроме последней установленной цели.

Если ваша версия Make достаточно недавно, вы можете обойти это путем $(DIR) в order-only prerequisite:

$(DIR)%.o: %.cpp | $(DIR) 
    ... 
+0

Вы правильно! Это был просто каталог. – MRJ

1

ли обновление файловой системы модифицированное время на каталог DIR, когда компилятор записывает файл .o там

$ (DIR)% о.: % .cpp $ (DIR)

гарантирует, что все файлы .o будут перекомпилированы, если что-либо обновит измененное время этого каталога.

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