2012-05-17 7 views
7

Tengo un proyecto para el cual modifico regularmente los encabezados y cuando lo hago, y me olvido de make clean y luego make, obtengo todo tipo de comportamiento extraño. Actualmente estoy usando Qt Creator como mi IDE, pero he visto esto suceder en un proyecto independiente de Qt. Mi proyecto se está haciendo bastante grande, y tener que reconstruir cada vez que hago un cambio de encabezado se está volviendo improductivo. ¿Alguna idea?Make no reconstruye los encabezados cuando se cambian

Para futuras consultas:

Si se utiliza el sistema de QMake:

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

extraño comportamiento como bits aleatorios de código que no he modificado en edades de repente a generar errores, o incluso código de la biblioteca tirando errores internos a sí misma .. – Drise

+0

Parece que faltan algunas dependencias en los encabezados. – juanchopanza

+0

Una nota a tener en cuenta: QMake genera automáticamente mi archivo de creación en función de mi archivo Qt .pro. La modificación de mi Makefile no es una opción, porque cuando el archivo .pro cambia, Makefile se vuelve a crear. – Drise

Respuesta

3

No sé nada acerca de su IDE, y no estoy seguro de si es relevante, y ya que no está incluyendo su archivo MAKE - Solo voy a decir lo obvio - ¿utiliza alguna dependencia generada automáticamente?

Para g ++ que utiliza el indicador -MD, a continuación, en el makefile incluir $(wildcard bin/*.d) (dependiendo de donde se crea el archivo de objeto, la mina se crean en 'bin')

Asimismo, asegúrese de borrar el archivo de dep en una clean build

+1

Creo que tuviste la mejor respuesta, porque me llevó a leer más sobre el sistema de generación de QMake y cómo establecer dependencias dentro de los archivos Qt .pro. – Drise

1

Esto es causado principalmente por las dependencias entre los archivos. Entonces, si modifica un archivo .h que está incluido en otro, ese archivo también deberá ser recompilado. Entonces, o necesita reducir sus inclusiones, o hacer su codificación en formato .h/.cpp cuando sea posible para hacer cambios en .cpp con más frecuencia que .h.

+0

Una nota adicional es que si configura sus dependencias correctamente en su sistema make, no siempre es necesario que haga limpieza cada vez, sino solo cuando cambia lo que está incluido dentro de un archivo .h. – pippin1289

+0

Hago la mayor parte de mi trabajo en archivos .cpp. Sin embargo, si necesito agregar una nueva función a una clase, o agregar una nueva variable privada, debo cambiar eso en el encabezado. – Drise

+0

Por supuesto, entonces debido a las dependencias se recompilará todo lo que incluye esto, por lo que puede ser útil reducir las dependencias entre los archivos. Por ejemplo, tener cuidado de incluir en archivos .h innecesariamente causa que pueda crear una dependencia en otros archivos. Normalmente intento incluir solo en .cpp cuando puedo. – pippin1289

2

La solución es tener dependencias de encabezado adecuadas en su archivo MAKE.

1) Use makedepend para generar los archivos de dependencia. Agregarías un objetivo a tu archivo MAKE que regenera el archivo de dependencia, y querrías invocarlo antes de hacer tu compilación. 2) Solo GCC: use las opciones '-MMD' y '-MP' en su línea de compilación para archivos .c/.cpp. Esto hace que GCC genere un archivo de dependencia para el archivo de entrada. Luego, puede incluirlos en su archivo MAKE. La ventaja aquí es que con esas dos opciones, a medida que agrega y elimina encabezados, debe comportarse como espera.

+0

no lo he usado en años, 'makedepend' puede ralentizar seriamente su compilación ... así que yo diría que se mantenga alejado cuando sea posible – nhed

1

Aquí hay un fragmento de mi propio archivo MAKE generando y usando archivos de dependencia creados automáticamente durante la compilación. Usted tendría que hacer una entrada adicional para los archivos 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 

No se olvide de añadir borrar archivos * .D de generación limpia

5

Vuelva a ejecutar qmake. Esto generará un nuevo Makefile que tendrá las dependencias apropiadas.

Ejemplo:

Un archivo file.h aspecto como el siguiente:

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

y file.cpp aspecto como el siguiente:

#include "file.h" 
... 

y que tiene en su .pro:

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

producirá lo siguiente en el Makefile resultante:

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

¡Esa es la respuesta! El Makefile generado a partir de un archivo QMake se actualiza automáticamente cuando se ejecuta "make" y se ha agregado un nuevo archivo de encabezado al archivo QMake. Sin embargo, si el nuevo archivo de encabezado ya no está incluido en los archivos .cpp en ese momento, no se computa ninguna actualización de dependencia, y qmake necesita volver a ejecutarse manualmente después. – DCTLib

Cuestiones relacionadas