2013-06-06 9 views
31

Ho letto anche se HERE, eppure continuo a non capire la sintassi della variabile qmake CONFIG. per esempio, se ho le seguenti impostazioni di configurazione nella mia .pro file:qMake: come esattamente qmake interpreta la sintassi "CONFIG (debug, debug | release)"

CONFIG(debug, debug|release) { 
    message("debug mode") 
}else { 
    message("release mode") 
} 

poi, durante l'esecuzione qmake, il seguente sarà visualizzato nel Output compilazione in Qt-Creator:

Project MESSAGE: debug mode 
Project MESSAGE: debug mode 
Project MESSAGE: release mode 

sapendo che sto costruendo il mio progetto in una "modalità debug" , quindi le mie domande sono:

  • perché non viene visualizzato il messaggio "modalità di debug" solo? e perché non mostrarlo solo una volta?
  • Quindi, poiché sto costruendo in una "modalità di debug", perché viene visualizzato il messaggio "Progetto MESSAGGIO: modalità di rilascio"?
  • Esattamente, ciò che la sintassi: CONFIG (debug, debug | release) significa veramente? vuol dire che costruisci in una modalità di debug, poi di nuovo costruisci in una modalità di debug e infine costruisca in una modalità di rilascio? So che queste parentesi "{}" significa un scope ma come qmake interpretare cosa c'è dentro queste parentesi "()"?

risposta

51

Nell'articolo a cui si è collegati, è stato detto all'inizio che il file di progetto viene elaborato per tre volte. Questo dovrebbe rispondere alla tua prima domanda; poiché viene elaborato tre volte, anche il tuo messaggio() viene eseguito tre volte. Perché viene elaborato più volte? Perché qmake non costruisce il tuo progetto! Genera solo istruzioni di compilazione che vengono poi utilizzate per costruire effettivamente il progetto. Per generare istruzioni di compilazione per tutte le possibili configurazioni, è necessario elaborare il file di progetto più volte, una volta per ogni configurazione.

Per la tua seconda domanda: il tuo progetto è costruito solo in modalità di debug se è quello che hai selezionato, ma le istruzioni di build sono create anche per la modalità di rilascio, come già menzionato sopra. Quando si utilizza "make" con mingw per esempio (piuttosto che Visual Studio), si ottengono due Makefile: Makefile.Release e Makefile.Debug. Quando genera il makefile di rilascio, è qui che viene stampata la "modalità di rilascio".

Infine, CONFIG(debug, debug|release) restituisce true se CONFIG contiene "debug" ma non "release", o se contiene sia "debug" che "release" ma "release" non appare dopo l'ultima occorrenza di "debug" . Per esempio si potrebbe avere questo:

CONFIG += release debug release debug release debug 

Dall'ultima "debug" viene dopo l'ultima "release", CONFIG(debug, debug|release) è vero.

Il primo argomento di CONFIG() ("debug" in questo caso) è il valore che deve apparire per ultimo. Il secondo argomento ("debug | release") è l'insieme di valori a cui viene confrontato il primo argomento.

Traducendo che a inglese avrebbe dato qualcosa di simile: valutare a true se appare "debug" almeno una volta e, nel caso in cui appare "rilascio" troppo, l'ultima apparizione di "debug" viene dopo l'ultima apparizione di "rilascio ".

+3

Grazie mille per la risposta, è estremamente importante e utile. Tuttavia, non ho capito la parte della "valutazione della dichiarazione".hai detto che "CONFIG (debug, debug | release)" è true se CONFIG contiene debug etc ... "cosa intendi con" contains "? vuoi dire definito come in 'CONFIG + = debug'? in tal caso, dato che non ho una definizione del genere nel mio '.pro file', dove si trova questa definizione? .. un'altra cosa, hai anche definito questo: 'CONFIG + = rilascia debug release debug release debug', cosa significa definire" debug "e" release "come questo? – hashDefine

+0

per favore, scusate anche le mie troppe domande perché non riesco a trovare nessuna fonte internet che la spieghi, per non parlare della vostra spiegazione è molto semplice, concisa e chiara. – hashDefine

+1

@hashDefine Qt Creator può aggiungere "release" a CONFIG quando chiama qmake. Ad esempio, se selezioni "Esegui qmake" nel menu "Build" e hai impostato la modalità di generazione per il rilascio, puoi vedere che passa "CONFIG + = release" come argomento per qmake. Dato che CONFIG può già contenere "debug" in esso (o perché lo hai messo nel tuo file di progetto tu stesso, o potrebbe provenire da un file mkspec), ci deve essere un modo per sovrascriverlo. Questo è il motivo per cui esiste la regola "appare ultimo in CONFIG". L'esempio che ho dato è stato proprio questo; un esempio. Non è utile aggiungere "release" e "debug" alla CONFIG. –

Problemi correlati