У меня есть базовый минимальный make-файл для компиляции источника C++; урезанная версия выглядит следующим образом:GNU Make, кажется, пропустит необходимые условия
TARGET = main
OBJ = $(patsubst %.cpp,%.o,$(wildcard *.cpp))
CPPFLAGS = -std=c++11 -Wall
build: $(TARGET)
$(TARGET): $(OBJ)
@echo "$? --> [email protected]"
g++ $(CPPFLAGS) -o [email protected] $?
@echo
%.o: %.cpp
@echo "$< --> [email protected]"
g++ $(CPPFLAGS) -c $<
@echo
При строительстве с нуля, все работает, как ожидалось:
clock.cpp --> clock.o
g++ -std=c++11 -Wall -c clock.cpp
main.cpp --> main.o
g++ -std=c++11 -Wall -c main.cpp
clock.o main.o --> main
g++ -std=c++11 -Wall -o main clock.o main.o
После изменения одного из исходных файлов, make
перестраивает соответствующий объектный файл, но по какой-то причине пропускает существующий (без изменений) объектный файл при попытке связать (clock.o --> main
вместо clock.o main.o --> main
):
clock.cpp --> clock.o
g++ -std=c++11 -Wall -c clock.cpp
clock.o --> main
g++ -std=c++11 -Wall -o main clock.o
При запуске make
снова, без изменения файла, связующими работает:
clock.o main.o --> main
g++ -std=c++11 -Wall -o main clock.o main.o
В чем причина такого поведения, и как это можно предотвратить?
Я бегу GNU Make 4.1 на i686 Linux 4.4