Makefile不会检查是否更新,反正只是编译

时间:2013-09-28 22:02:11

标签: makefile

我的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 $@ $(OBJECTS) $(LIBRARIES)

$(DIR)%.o: %.cpp $(DIR)
    $(CXX) $(CFLAGS) -c $< -o $@ 

$(DIR):
    @mkdir $(DIR)

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

输出显示问题:

stud@pc:~/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
stud@pc:~/Desktop/Locktest$ make
g++ -Wall -c myclass.cpp -o host/myclass.o 
g++ -o locktest host/myclass.o host/mylock.o -pthread

2 个答案:

答案 0 :(得分:1)

当编译器在那里写一个.o文件时,文件系统是否更新了DIR目录上的修改时间

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

确保在更新该目录的修改时间时,将重新编译所有.o文件。

答案 1 :(得分:1)

正如@lijat所指出的那样,当你在$(DIR)中构建一个对象时,操作系统会更新目录的修改时间,因此在这个规则中:

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

先决条件$(DIR)似乎总是比最后一个目标构建的目标更新。

如果您的Make版本已经足够,那么您可以通过$(DIR) order-only prerequisite来完成此操作:

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