2009-12-08 14 views
93

Ho un progetto che utilizza le librerie log4cxx, boost, ecc. Le cui intestazioni generano molti avvisi (ripetitivi). C'è un modo per sopprimere gli avvisi dalla libreria include (ad esempio #include < some-header.h >) o include da determinati percorsi? Mi piacerebbe usare -Wall e/o -Wextra come al solito sul codice del progetto senza informazioni pertinenti oscurate. Attualmente utilizzo grep su make output ma mi piacerebbe qualcosa di meglio.Come sopprimere gli avvisi GCC dalle intestazioni delle librerie?

risposta

95

Si può provare a includere le intestazioni di libreria utilizzando -isystem anziché -I. Ciò li renderà "header di sistema" e GCC non segnalerà avvisi per loro.

+9

Se stai provando a farlo in XCode, inserisci il percorso -isystem nei tuoi "altri flag C++" nei "flag del compilatore personalizzato" nelle impostazioni di generazione del target. –

+2

Uno svantaggio potenziale è che su alcune piattaforme, g ++ avvolgerà automaticamente qualsiasi intestazione di sistema in "extern" C "', portando a errori dispari sul collegamento C se si '# include' un'intestazione C++ in un percorso' -isystem'. –

+0

+1 mi ha aiutato a risolvere i problemi con fastidiosi avvertimenti di boost http://stackoverflow.com/questions/35704753/warnings-from-boost – mrgloom

4

Puoi provare a utilizzare precompiled headers. Gli avvertimenti non scompariranno ma almeno non verranno visualizzati nella compilation principale.

+1

Questa potrebbe essere una buona idea. Le inclusioni di terze parti non cambiano ogni giorno. – AdSR

+0

Esattamente. Anche se non li ho usati così tanto in Linux, funzionano abbastanza bene su Visual Studio. –

8

#pragma sono istruzioni per il compilatore. puoi impostare qualcosa prima di #include e disabilitarlo dopo.

È anche possibile farlo allo command line.

Un'altra pagina GCC specifica su disabling warnings.

vorrei andare per la possibilità di utilizzare # pragma di all'interno del codice sorgente, e quindi fornendo un suono ragione (come un commento) del perché si sta disabilitando le avvertenze. Ciò significherebbe ragionamento sui file delle intestazioni.

GCC si avvicina a questo classifying i tipi di avviso. Puoi classificarli come avvertimenti o da ignorare. Gli articoli precedentemente collegati ti mostreranno quali avvisi potrebbero essere disabilitati.

Nota: è possibile anche massaggiare il codice sorgente per evitare determinati avvisi utilizzando attributes; tuttavia, questo ti lega abbastanza strettamente a GCC.

Nota2: GCC utilizza anche lo pop/push interface come utilizzato nel compilatore di Microsoft - Microsoft disattiva gli avvisi tramite questa interfaccia. Ti suggerisco di indagare ulteriormente, perché non so se è possibile.

+0

Ho preso in considerazione la direttiva ma se sopprimo un avviso prima di includere un'intestazione, come posso riportarlo allo * stato precedente * dopo #include? Voglio vedere tutti gli avvertimenti per il codice del progetto (mi ha aiutato già alcune volte) ma ho il controllo dalla riga di comando. – AdSR

+0

ha aggiunto più informazioni. –

-6

Ci devono essere motivi per tali avvertenze. Questi saranno causati da errori nel codice che utilizza la libreria o da errori nel codice della libreria stesso. Nel primo caso, correggi il tuo codice. Nel secondo caso, smetti di usare la libreria o se è FOSS, risolvilo.

+0

+1 per un buon consiglio: D ma sta chiedendo come fare qualcosa di specifico: D –

+3

Alcuni avvisi sono impossibili o molto difficili da risolvere, specialmente nel codice di terze parti, * specialmente * in tale codice ricco di metaprogrammazione come Boost. – ulidtko

+3

Peggio quello che mi infastidisce è * "dichiarazione di 'c' ombreggia un membro di 'this' [-Werror = shadow]" * profondo, profondo in qualche colpo di intestazione. Questo non è certamente un problema, ma questo e altri problemi simili stanno emettendo risultati e rendendo difficile per me trovare delle istanze come una vera ombra nel nostro codice. – dmckee

23

Ho trovato il trucco. Per la libreria include, invece di -Idir utilizzare -sistema di sistema nel makefile. GCC tratta quindi boost ecc. Come include il sistema e ignora qualsiasi avviso da loro.

34

È possibile utilizzare la direttiva. Per esempio:

// save diagnostic state 
#pragma GCC diagnostic push 

// turn off the specific warning. Can also use "-Wall" 
#pragma GCC diagnostic ignored "-Wunused-but-set-variable" 

#include <boost/uuid/uuid.hpp> 
#include <boost/uuid/uuid_generators.hpp> 
#include <boost/uuid/uuid_io.hpp> 
#include <boost/lexical_cast.hpp> 

// turn the warnings back on 
#pragma GCC diagnostic pop 
+1

Disponibile solo con GCC> = 4.6 – Caduchon

66

Per coloro che utilizzano CMake, è possibile modificare le include_directories direttive per includere il simbolo SYSTEM che sopprime avvertimenti contro tali intestazioni.

+0

Cosa succede se la libreria fornisce una variabile '{{LIBFOO_USE_FILE}' che deve essere utilizzata con CMake's [include()] (https://cmake.org/cmake/help/latest/command /include.html) comando? – waldyrious

+2

Questa sembra quasi la soluzione al mio problema. Ho 1.) un bersaglio binario, che dipende da 2.) un header solo target scritto da me stesso, che dipende da 3.) alcune librerie esterne. Non ho idea di come ottenere solo gli avvisi per 1 e 2. Hai qualche idea? – knedlsepp

+0

Sembra non funzionare. Ho provato questo con un progetto che usa 'easylogging ++' e ottengo la stessa enorme quantità di avvertimenti dal 'easylogging ++ .h' anche se la cartella in cui si trova è stata inclusa con l'opzione' SYSTEM'. – rbaleksandar

0

Se è necessario sostituire esplicitamente un'intestazione di sistema, si è limitati alla direttiva. Puoi verificare quale include stai utilizzando l'output make depend.

Vedere anche diagnostic push-pop for gcc >= 4.6

Problemi correlati