Come sopprimere gli avvisi di GCC dalle intestazioni delle librerie?


126

Ho un progetto che utilizza log4cxx, boost, ecc. Le librerie le cui intestazioni generano molti avvisi (ripetitivi). Esiste un modo per sopprimere gli avvisi dagli include di libreria (ad esempio #include <some-header.h>) o include da determinati percorsi? Vorrei usare -Wall e / o -Wextra come al solito sul codice del progetto senza che le informazioni rilevanti vengano oscurate. Attualmente uso grep su make output ma vorrei qualcosa di meglio.

Risposte:


127

Puoi provare a includere le intestazioni della libreria usando -isysteminvece di -I. Questo li renderà "intestazioni di sistema" e GCC non segnalerà avvisi per loro.


11
Se stai tentando di farlo in XCode, inserisci il percorso -isystem negli "altri flag C ++" nei "flag del compilatore personalizzato" nelle impostazioni di compilazione di destinazione.
Matt Parkins

3
Un potenziale svantaggio è che su alcune piattaforme, g ++ avvolgerà automaticamente tutte le intestazioni di sistema extern "C", portando a strani errori sul collegamento C se hai #includeun'intestazione C ++ in un -isystempercorso.
Tavian Barnes,

1
1 mi ha aiutato a risolvere i problemi con spinta avvisi fastidiosi stackoverflow.com/questions/35704753/warnings-from-boost
mrgloom

3
Perché questo ha così tanti voti in più rispetto alla risposta dell'OP che diceva esattamente la stessa cosa 1,5 ore prima?
underscore_d

1
Per Xcode: cosa succede se non ci fosse alcun percorso della cartella in "Altri flag C ++" nelle mie impostazioni di build di destinazione? Qualcuno potrebbe elaborare queste soluzioni?
Ossir

107

Per coloro che utilizzano CMake, è possibile modificare le proprie include_directoriesdirettive per includere il simbolo SYSTEMche sopprime gli avvertimenti contro tali intestazioni.

include_directories(SYSTEM "${LIB_DIR}/Include")
                    ^^^^^^

Cosa succede se la libreria fornisce una ${LIBFOO_USE_FILE}variabile che deve essere utilizzata con il comando include () di CMake ?
waldyrious

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

2
Non sembra funzionare. L'ho provato con un progetto che utilizza easylogging++e ricevo la stessa enorme quantità di avvisi easylogging++.hanche se la cartella in cui risiede è stata inclusa con l' SYSTEMopzione.
rbaleksandar

Grazie mille per questo. Mi ha salvato da pagine e pagine di avvertimenti.
Svalorzen

1
Stesso commento della risposta accettata: questa è una cattiva pratica per me.
Raffi

55

Puoi usare i pragmi. 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

3
Disponibile solo con GCC> = 4.6
Caduchon

1
Amo l'abilità dei pragmi push / pop. Ricordo qualcosa come Java disponibile anni fa ed ero frustrato / geloso per C / C ++. Mi piace che sia disponibile ingcc
Trevor Boyd Smith

@TrevorBoydSmith MS clha avuto questa capacità anche per anni ... A volte gccè un po 'lento ad adattarsi.
Alexis Wilke

29

Ho trovato il trucco. Per la libreria include, invece di -Idirutilizzare -isystem dirnel makefile. GCC quindi tratta boost ecc. Come il sistema include e ignora qualsiasi avviso da essi.


Nota che se usi un'intestazione precompilata devi aggiungere il flag quando compili sia l'intestazione che il codice.
user202729

9

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

Puoi anche farlo dalla riga di comando .

Un'altra pagina di GCC specifica sulla disabilitazione degli avvisi .

Vorrei scegliere l'opzione di utilizzare # pragma's all'interno del codice sorgente e quindi fornire una valida ragione (come commento) del motivo per cui stai disabilitando gli avvisi. Ciò significherebbe ragionare sui file delle intestazioni.

GCC si avvicina a questo classificando i tipi di avviso. Puoi classificarli come avvertimenti o per essere ignorati. Gli articoli collegati in precedenza ti mostreranno quali avvisi potrebbero essere disabilitati.

Nota: puoi anche massaggiare il codice sorgente per evitare determinati avvisi utilizzando gli attributi ; tuttavia, questo ti lega molto strettamente a GCC.

Nota 2: GCC utilizza anche l' interfaccia pop / push utilizzata nel compilatore di microsoft: Microsoft disabilita gli avvisi tramite questa interfaccia. Ti suggerisco di approfondire questo aspetto, poiché non so se sia possibile.


Ho considerato i pragmi, ma se sopprimo un avviso prima di includere un'intestazione, come faccio a riportarlo allo stato precedente dopo #include? Voglio vedere tutti gli avvisi per il codice del progetto (mi ha aiutato già alcune volte) ma ho il controllo dalla riga di comando.
AdSR

4

Puoi provare a utilizzare intestazioni precompilate . Gli avvisi non scompariranno, ma almeno non verranno visualizzati nella compilation principale.


1
Questa potrebbe effettivamente essere una buona idea. I contenuti di terze parti non cambiano ogni giorno.
AdSR

Esattamente. Anche se non li ho usati molto su Linux, funzionano abbastanza bene su Visual Studio.
Pablo Santa Cruz

No, verranno comunque visualizzati nella compilazione a meno che non si utilizzi un altro modo per sopprimerli (ad esempio -isystem, ma ricordarsi di usarlo sia nella compilazione dell'intestazione che nel codice)
user202729


1

Mettendo quanto segue

#pragma GCC system_header

disattiverà gli avvisi di GCC per tutto il codice seguente in questo file.


-9

Devono esserci ragioni per questi avvertimenti. Questi saranno causati da errori nel codice che utilizza la libreria o da errori nel codice della libreria stesso. Nel primo caso, correggi il codice. Nel secondo caso, smetti di usare la libreria o se è codice FOSS, aggiustalo.


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

4
Alcuni avvisi sono impossibili o molto difficili da correggere, specialmente nel codice di terze parti, specialmente in un codice ricco di metaprogrammazione come quello di Boost.
ulidtko

3
Peggio ancora quello che mi infastidisce è "la dichiarazione di 'c' ombre un membro di 'questo' [-Werror = shadow]" in profondità, in profondità in qualche intestazione di spinta. Questo non è certamente un problema, ma e problemi simili generano risultati e mi rendono difficile trovare istanze un vero e proprio shadowing nella nostra base di codice.
dmckee --- gattino ex moderatore
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.