2015-12-12 4 views
4

Предположим, что у меня есть правило ниже в Makefile.Makefile | Зависимость от другого файла заголовка, включенного в файл заголовка

test.o: test.cpp foo.h 
     g++ -c -o test.o test.cpp 

Теперь предположим, что foo.h включает bar.h, как показано ниже.

user $ head -n 5 foo.h 
#include"bar.h" 
/* 
. 
. 
*/ 
user $ 

Будет test.o построится, если есть какие-либо изменения в bar.h?

Или я должен особо отметить bar.h в правиле, как показано ниже:

test.o: test.cpp foo.h bar.h 
     g++ -c -o test.o test.cpp 

ответ

4

Будет ли построено test.o, если произошли какие-либо изменения в bar.h?

Номер Марка не имеет возможностей узнать об этой зависимости, или проверке изменений в вашем #include с.

За исключением, конечно, если вы оставляете зависимостями заголовка обработки с сущностью, которая знает о них: Компилятор. (Предполагается, что GCC и GNU сделать в этом примере.)

  1. Не список заголовков в качестве зависимостей на всех.

  2. Создайте список источник файлов в вашем проекте.

    SRCFILES := ... 
    
  3. Создание списка зависимостей файлов, один .d файл для каждого SRCFILE.

    DEPFILES := $(patsubst %.cpp,%.d,$(SRCFILES)) 
    
  4. Включите эти файлы зависимостей в ваш Makefile. (Ведущие - средства сделать не сгенерирует ошибку, если они не существуют, например, на первую компиляции.)

    -include $(DEPFILES) 
    
  5. Использования родового правила, пусть компилятор генерирует список зависимостей заголовков во время компиляция каждого исходного файла.

    %.o: %.cpp Makefile 
        @$(CXX) $(CXXFLAGS) -MMD -MP -c $< -o [email protected] 
    

    -MMD генерирует сделать правила делает объектные файлы зависят от какой-либо (несистемных) заголовочные файлы включены, названный *.d. -MP добавляет фиктивные правила, которые избегают ошибок, если файл заголовка будет удален из ваших источников.

2

GCC (и, вероятно, Clang) можно построить список зависимостей для вас; Таким образом, вы можете просто сделать ваши объектные файлы из их источника (CPP) Файл:

depend: .depend 

.depend: $(SRC_FILES) 
     rm -f ./.depend 
     $(CC) $(CFLAGS) -MM $^ -MF ./.depend; 

include .depend 

%.o: %.cpp 
    $(CC) $(CFLAGS) -c $< 

Вы можете также найти интерес к makedepend инструмента.

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