Qt4 in Visual Studio 2008 - i file moc-ed vengono esclusi dalla build?
-
05-07-2019 - |
Domanda
Di recente ho installato VS Addin da Qt Software e ho importato il mio progetto .pro su VS2008. In generale, tutto funziona bene, con una piccola ma fastidiosa eccezione.
Supponiamo di avere un file.cpp con una classe che dichiara che è un Q_OBJECT. Quindi, in quanto tale, il file è MOC-ed e viene generato moc_file.cpp, ed è disponibile nella soluzione sotto "File generati". Fin qui tutto bene.
La cosa divertente è che quando cambio qualcosa in file.cpp (aggiungi una riga, per esempio), e salvo il file usando Ctrl + S, il moc_file.cpp viene escluso dalla build (puoi vedere un segno di nessuna voce sull'icona). E ho riscontrato molti errori tipici del linker quando premo F7 per creare una soluzione. Per risolvere la situazione, devo andare alle proprietà di moc_file.cpp e cambiare " Exclude dalla build " da " Sì " a "No". Quindi tutto funziona bene.
Qualcun altro sta vivendo lo stesso? Sto facendo qualcosa di sbagliato?
Soluzione
Problema risolto. Ho scoperto che nel mio file .pro fatto a mano che descrive il mio progetto, avevo MOC_DIR specificato come:
MOC_DIR = .moc
Dopo l'importazione nella directory di Visual Studio per " File generati " era lo stesso per Release e Debug. Quindi, quando la mia configurazione attiva era Debug, ad esempio, quando ho salvato un file, questo è stato escluso dalla build perché era ragionevole per il file relativo alla versione, proprio come suggerivano rpg e Andrew. Dopo aver modificato la directory in .moc \ $ (ConfigurationName) il problema non viene più visualizzato (e vedo 2 versioni di ciascun file generato nella mia soluzione, una per ogni configurazione).
Grazie per il vostro aiuto a tutti!
Altri suggerimenti
In realtà, ho trovato la soluzione per quella "funzione". Devi aggiungere ENTRAMBI i file da GeneratedFiles \ Debug e GeneratedFiles \ Debug (o da altre directory di configurazione). Qt esclude dalla compilazione tutto ciò che non appartiene al tipo di build attualmente selezionato.
Sì, utilizzo l'ultimo VS Addin e il mio progetto è correttamente visto come un progetto Qt.
hai impostato correttamente la tua configurazione?
Apri la finestra " Impostazioni di configurazione debug " Impostare i seguenti elementi come indicato di seguito:
- " Crea riga di comando " qmake -project & amp; qmake & amp; nmake debug
- " Comandi puliti " nmake debug-clean
- " Ricostruisci riga di comando " qmake & amp; nmake debug
Ripeti lo stesso con la configurazione di rilascio
Ho visto gli esclusi dal comportamento di compilazione in VS2008 (anche VS 2003), ma il progetto si sviluppa correttamente. Quando si modifica un file moc'able, Qt dovrà ricreare il file moc'ed perché non è aggiornato.
Sospetto che l'algoritmo di Qt sia simile a:
- rileva che il file è stato modificato
- imposta il vecchio file moc come escluso dalla build
- aggiungi un nuovo file al progetto con lo stesso nome e includilo nella build
Guardando il mio progetto VS 2003, vedo che alcuni file moc_ * sono inclusi due volte nel progetto, una versione è impostata come esclusa dalla build e l'altra no.
Ricreare il file .vsproj
usando qmake potrebbe risolvere il problema.
Per ogni file QObject che hai, il plugin QT crea un file moc_ per ogni configurazione di build (di solito solo Debug e Release). Quando si modifica la configurazione corrente, è possibile vedere i segni No entry che passano da un file all'altro.
I file moc_ non dovrebbero cambiare quando si modifica il file .cpp. solo quando cambi i file .h .. Tutto ciò mi porta a pensare che qualcosa di sbagliato sia successo con la tua configurazione e davvero il modo migliore per risolverlo è ricrearlo con qmake usando qualcosa del genere:
qmake -spec win32-msvc2008