2012-05-17 9 views
7

Ho un progetto per il quale modifico regolarmente le intestazioni e quando lo faccio, e dimentico di make clean quindi make, ottengo ogni sorta di comportamento strano. Attualmente sto usando Qt Creator come IDE, ma ho visto questo accadere in un progetto indipendente da Qt. Il mio progetto sta diventando abbastanza grande, e dover ricostruire ogni volta che faccio un cambio di intestazione sta diventando improduttivo. qualche idea?Make non ricostruisce le intestazioni quando viene modificato

di riferimento futuro:

Se si utilizza il sistema QMake:

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

strano comportamento bit come casuali di codice che non ho modificato in epoche improvvisamente gettando errori, o anche codice della libreria gettando errori interni a se stesso .. – Drise

+0

Sembra che manchino alcune dipendenze sulle intestazioni. – juanchopanza

+0

Una nota da considerare: Il mio file make viene generato automaticamente da QMake, in base al mio file Qt .pro. Modificare il mio Makefile in qualche modo non è un'opzione, perché quando il file .pro cambia, il Makefile viene ricreato. – Drise

risposta

3

Non so nulla del tuo IDE, e non sono sicuro se pertinente, e dal momento che non includi il tuo makefile - ti dirò semplicemente l'ovvio - usi qualche dipendenza auto generata?

Per g ++ Io uso la bandiera -MD, poi nel makefile includere $(wildcard bin/*.d) (a seconda di dove è stato creato il file oggetto, il mio sono creati in 'bin')

Assicuratevi anche di eliminare il file dep su un clean build

+1

Credo che tu abbia avuto la risposta migliore, perché mi ha portato a leggere di più sul sistema di generazione di QMake e su come impostare le dipendenze nei file Qt .pro. – Drise

1

Questo è causato principalmente dalle dipendenze tra i file. Quindi se modifichi un file .h che è incluso in un altro, anche quel file dovrà essere ricompilato. Quindi, o è necessario ridurre le inclusioni, o fare la codifica in formato .h/.cpp quando possibile per apportare modifiche in .cpp più spesso di .h.

+0

Un'ulteriore nota, è che se si impostano correttamente le dipendenze nel proprio sistema, non è sempre necessario pulirle ogni volta, ma solo quando si cambia ciò che è incluso in un file .h. – pippin1289

+0

Realizzo la maggior parte del mio lavoro nei file .cpp. Tuttavia, se devo aggiungere una nuova funzione a una classe, o aggiungere una nuova variabile privata, devo cambiarla nell'intestazione. – Drise

+0

Ovviamente, quindi a causa delle dipendenze tutto ciò che include questo verrà ricompilato, quindi la riduzione delle dipendenze tra i file può essere d'aiuto. Ad esempio fare attenzione a includere in .h file inutilmente causa che può creare una dipendenza in altri file. Di solito cerco di includere solo in .cpp quando posso. – pippin1289

2

La soluzione è avere una corretta dipendenza dell'intestazione nel makefile.

1) Utilizzare makedepend per generare i file delle dipendenze. Dovresti aggiungere un target al tuo makefile che rigenera il file delle dipendenze, e dovresti invocarlo prima di fare effettivamente la tua compilation. 2) Solo GCC: utilizzare le opzioni '-MMD' e '-MP' sulla riga di compilazione per i file .c/.cpp. Ciò fa in modo che GCC generi un file di dipendenza per il file di input. Quindi, puoi includerli nel tuo makefile. Il vantaggio è che con queste due opzioni, quando aggiungi e rimuovi le intestazioni, dovrebbe comportarsi come previsto.

+0

havent usato da anni, 'makedepend' può rallentare seriamente la tua compilation ... quindi direi di stare alla larga quando è possibile – nhed

1

Ecco un estratto dal mio makefile che genera e utilizza i file di dipendenza creati automaticamente durante la compilazione. Si dovrebbe fare una voce aggiuntiva per i file 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 

Non dimenticate di aggiungere cancellare i file * .d sulla generazione pulita

5

Re-run qmake. Questo genererà un nuovo Makefile che avrà dipendenze appropriate.

Esempio:

Un file file.h guardando come il seguente:

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

e file.cpp guardando come la seguente:

#include "file.h" 
... 

e avere nel vostro .pro:

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

produrrà quanto segue nella risultante 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

Questa è la risposta! Il Makefile generato da un file QMake si aggiorna automaticamente quando viene eseguito "make" e un nuovo file di intestazione è stato aggiunto al file QMake. Tuttavia, se il nuovo file di intestazione non è già incluso nei file .cpp in quel punto, non viene calcolato alcun aggiornamento delle dipendenze e qmake deve essere rieseguito manualmente in seguito. – DCTLib

Problemi correlati