2012-05-17 2 views
7

У меня есть проект, для которого я регулярно изменяю заголовки, и когда я это делаю, и забываю make clean, затем make, я получаю все виды странного поведения. В настоящее время я использую Qt Creator в качестве моей IDE, но я видел, как это происходит в Qt-независимом проекте. Мой проект становится довольно большим, и необходимость перестраивать каждый раз, когда я делаю изменение заголовка, становится непродуктивным. Есть предположения?Make не перестраивает заголовки при изменении

Для дальнейшего использования:

При использовании системы QMAKE:

 
DEPENDPATH += . \ 
    HeaderLocation1/ \ 
    HeaderLocation2/ \ 
    HeaderLocation2/HeaderSubLocation1/ \ 
    HeaderLocation2/HeaderSubLocation2/ \ 
    HeaderLocation2/HeaderSubLocation3/ \ 
    HeaderLocation2/HeaderSubLocation4/ \ 
    HeaderLocation2/HeaderSubLocation5/ \ 
    HeaderLocation3/ \ 
    HeaderLocation3/HeaderSubLocation1/ \ 
    HeaderLocation3/HeaderSubLocation2/ \ 
+0

странного поведение, как случайные битах коды, которые я не модифицированной в возрасте внезапно бросали ошибки, или даже код библиотеки метания ошибки внутренней себе .. – Drise

+0

Похоже, что вам не хватает некоторых зависимостей от заголовков. – juanchopanza

+0

Примечание: Мой файл создается автоматически с помощью QMake, основываясь на моем файле Qt .pro. Модификация моего файла Makefile несколько не является вариантом, потому что когда файл .pro изменяется, Makefile воссоздается. – Drise

ответ

3

Dont знать что-нибудь о вашей среде IDE, и не уверен, если это необходимо, и поскольку вы не включаете свой make-файл, я просто укажу на очевидное - используете ли вы какие-либо автогенерируемые зависимости?

Для г ++ Я использую -MD флаг, то в Makefile включают $(wildcard bin/*.d) (в зависимости от того, где создается файл объекта, шахта создается в «бункере»)

Кроме того, убедитесь, чтобы удалить DEP файл на clean build

+1

Я считаю, что у вас был лучший ответ, потому что это заставило меня больше узнать о системе генерации QMake и о том, как установить зависимости в файлах Qt .pro. – Drise

1

Это в основном вызвано зависимостей между файлами. Поэтому, если вы измените файл .h, который включен в другой, этот файл также нужно будет перекомпилировать. Поэтому либо вам нужно уменьшить количество включений, либо сделать свое кодирование в формате .h/.cpp, когда это возможно, чтобы внести изменения в .cpp чаще, чем .h.

+0

Дополнительным примечанием является то, что если вы правильно установили свои зависимости в своей системе make, вам не всегда нужно выполнять очистку каждый раз, а только при изменении того, что входит в файл .h. – pippin1289

+0

Я делаю большую часть своей работы в файлах .cpp. Однако, если мне нужно добавить новую функцию в класс или добавить новую приватную переменную, я должен изменить ее в заголовке. – Drise

+0

Конечно, поэтому из-за зависимостей все, что включает в себя, будет перекомпилировано, поэтому может помочь сокращение зависимостей между файлами. Такие, как осторожное включение в .h файлов без необходимости, могут создавать зависимость в других файлах. Обычно я пытаюсь включить только в .cpp, когда смогу. – pippin1289

2

Решение должно иметь правильную зависимость заголовка в файле makefile.

1) Используйте makedepend для генерации файлов зависимостей. Вы добавили бы цель в свой файл makefile, который восстанавливает файл зависимостей, и вы хотите вызвать его, прежде чем выполнять свою компиляцию. 2) Только GCC: используйте опции «-MMD» и «-MP» на вашей линии компиляции для файлов .c/.cpp. Это заставляет GCC генерировать файл зависимостей для входного файла. Затем вы можете включить их в свой файл. Преимущество здесь в том, что с этими двумя параметрами при добавлении и удалении заголовков он должен вести себя так, как вы ожидаете.

+0

havent использовал его в годах, 'makedepend' может серьезно замедлить вашу компиляцию ... так что я бы сказал, держась подальше, когда это возможно – nhed

1

Вот выдержка из моего собственного файла makefile, генерирующего и использующего файлы зависимостей, автоматически созданные во время компиляции. Вам придется сделать дополнительную запись для CPP файлов

%.o : %.c 
    $(CC) -M $(CFLAGS) -o $*.P $< 
    @cp $*.P $*.d; \ 
      sed -e 's/#.*//' -e 's/^[^:]*: *//' -e 's/ *\\$$//' \ 
       -e '/^$$/ d' -e 's/$$/ :/' < $*.P >> $*.d; \ 
      rm -f $*.P 
    $(CC) $(CFLAGS) -c $< -o [email protected] 

-include *.d 

Не забудьте добавить удалить файлы * .D на чистую сборку

5

Re перспективе qmake. Это создаст новый Makefile, который будет иметь соответствующие зависимости.

Пример:

Файл file.h выглядит как следующее:

#include "some.h" 
#include "header.h" 
#include "files.h" 
... 

и file.cpp выглядит как следующее:

#include "file.h" 
... 

и имеющий в своем .pro:

HEADERS += file.h some.h header.h files.h 
SOURCES += file.cpp 

будет производить следующее в результате Makefile:

file.o: ../src/file.cpp ../src/file.h \ 
     ../src/some.h \ 
     ../src/header.h \ 
     ../src/files.h 
    $(CXX) -c $(CXXFLAGS) $(INCPATH) -o file.o ../src/file.cpp 
+0

Вот и ответ! Файл Makefile, созданный из файла QMake, автоматически обновляется, когда выполняется «make», и новый файл заголовка был добавлен в файл QMake. Однако, если новый файл заголовка не включен в файлы .cpp уже в этот момент, обновление зависимостей не вычисляется, и qmake необходимо повторно запустить вручную. – DCTLib

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