2017-02-12 4 views
1

У меня есть базовый минимальный 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

ответ

2

используется неправильно автоматическую переменную в g++ $(CPPFLAGS) -o [email protected] $? рецепте. https://www.gnu.org/software/make/manual/html_node/Automatic-Variables.html:

$?

Имена всех предварительных условий, которые являются более новыми, чем цель, с пробелами между ними.

Так что сделайте именно то, что вы просите об этом: свяжите главную цель со всеми обновленными предпосылками и пропустите нетронутые предпосылки.

g++ $(CPPFLAGS) -o [email protected] $^ рецепт исправит проблему.

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