2015-06-20 2 views
-1

У меня есть 2 .cpp файлов: main.cppA.cpp и несколько файлов заголовков в include dir.Makefile не перекомпилируется при изменении файла заголовка

Я пытаюсь написать make-файл, который перекомпилируется всякий раз, когда изменяется файл заголовка.

Теперь я пробовал следовать схемам метода в примере here. Однако я не мог начать. Вот моя попытка.

CC := g++ 
OBJS := main.o A.o 
OUTPUT := program.exe 
INCLUDE_DIR := -I ./include \ 

#linking step 
all: $(OBJS) 
    $(CC) $(INCLUDE_DIR) $(OBJS) -o $(OUTPUT) 

#compile and generate dependency info 
%.o : %.cpp 
    $(CC) $(INCLUDE_DIR) -c $*.cpp -o $*.o 
    $(CC) $(INCLUDE_DIR) -MMD -c -o [email protected] $< 

-include *.d 
+1

Что вы имеете в виду, что «не можете начать»? Какая ошибка? – Barry

ответ

2

Вы не включаете файлы зависимостей правильно. Подстановочный шаблон не делает то, что вы хотите. Было бы проще просто:

DEPS = $(OBJS:.o=.d) 
-include $(DEPS) 

Чтобы на самом деле символы подстановки зависимостей, вы должны сделать:

-include $(wildcard *.d) 

Обратите внимание, что НКУ фактически позволяет создавать зависимость и файлы объекта в в то же время. Это может быть просто ваше правило. Также мне лучше указать, где все идет, в случае возникновения каких-либо проблем:

%.o : %.cpp 
    $(CC) $(INCLUDE_DIR) -c $< -o [email protected] -MMD -MF $(@:.o=.d) 
+1

Не могли бы вы объяснить, как работает строка с флагами '-MMD' и' -MF'? – SU3

+1

@ SU3 См. [Параметры препроцессора] (https://gcc.gnu.org/onlinedocs/gcc/Preprocessor-Options.html), в частности описание для '-M'. – Barry

+0

Флаг 'MF' бессмыслен, когда используется' MMD', в отличие от флага 'MD'. – Chnossos

1

Необходимо включить файлы заголовков в список зависимостей. Например:

%.o : %.cpp %.hh 
    $(CC) $(INCLUDE_DIR) -c $*.cpp -o $*.o 
    $(CC) $(INCLUDE_DIR) -MMD -c -o [email protected] $< 

Если у вас есть a.hh для каждого a.cpp.

Синтаксис файла делают это

target: dependency_1 dependency_2 etc 
    rule 

Все зависимости проверены, когда они были обновлены в последний раз, и если один из них имеет временную метку более недавнее, то цель, то правило выполняется. В вашем Makefile у вас нет заголовков в списке зависимостей.

+0

Не может быть% .hh для каждого% .cpp, и вся точка автогенерации зависимостей должна быть правильной. – Barry

+0

@Barry Я так понимаю, поэтому я написал «** Если ** у вас есть' a.hh' для каждого 'a.cpp'. Кроме того, я просто расширил ответ. – SU3

+0

Это большое предположение, которое, вероятно, никогда не будет истинным, сделанное еще более ненужным из-за того, что цель OP заключается в том, чтобы компилятор генерировал правильные зависимости для него через файлы '* .d'. Этот ответ просто неправильный. – Barry

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