我的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
答案 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)
...