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
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.
Puoi provare a utilizzare precompiled headers. Gli avvertimenti non scompariranno ma almeno non verranno visualizzati nella compilation principale.
Questa potrebbe essere una buona idea. Le inclusioni di terze parti non cambiano ogni giorno. – AdSR
Esattamente. Anche se non li ho usati così tanto in Linux, funzionano abbastanza bene su Visual Studio. –
#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.
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
ha aggiunto più informazioni. –
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.
+1 per un buon consiglio: D ma sta chiedendo come fare qualcosa di specifico: D –
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
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
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.
È 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
Disponibile solo con GCC> = 4.6 – Caduchon
Per coloro che utilizzano CMake, è possibile modificare le include_directories
direttive per includere il simbolo SYSTEM
che sopprime avvertimenti contro tali intestazioni.
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
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
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
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
- 1. Come sopprimere gli avvisi nelle intestazioni esterne in Visual C++
- 2. Come sopprimere gli avvisi per il file incluso dall'intestazione
- 3. Come sopprimere tutti gli avvisi utilizzando MSBuild
- 4. Come sopprimere gli avvisi in vim-latex?
- 5. TYPO3: come sopprimere gli avvisi deprecati?
- 6. Come sopprimere gli avvisi in Qt Creator
- 7. Disabilita tutti gli avvisi gcc
- 8. IDEA: Come sopprimere gli avvisi per errori ortografici?
- 9. Disabilita condizionalmente gli avvisi con qmake/gcc?
- 10. Come sopprimere gli avvisi sulle variabili non utilizzate in C++?
- 11. Come posso sopprimere gli avvisi di cast non controllati?
- 12. GCC non onora 'pragma GCC diagnostic' per tacitare gli avvisi
- 13. Sopprimere -Wunknown-pragma di avviso in GCC
- 14. Sopprimere l'avviso g ++ "-Wliteral-suffix" per specifiche intestazioni specifiche
- 15. Come rimuovere gli avvisi GCC nella regione #pragma?
- 16. Come sopprimere gli avvisi nei file di origine di terze parti?
- 17. Come posso sopprimere l'avviso delle intestazioni urlfetch in Google App Engine?
- 18. Come mantenere le librerie di test Android separate dalle librerie delle applicazioni in Android Studio?
- 19. Perché le intestazioni delle librerie statiche non vengono trovate?
- 20. disabilita avvisi specifici in gcc
- 21. Utilizzo di typecasting per rimuovere gli avvisi del compilatore gcc
- 22. gcc: come gestire al meglio gli avvisi relativi alla fine della funzione (irraggiungibile) dopo l'interruttore?
- 23. Come disabilitare tutti gli avvisi usando le direttive pragma in GCC
- 24. CMake (cotire) intestazioni precompilate e disabilitazione avvisi
- 25. Come rimuovere le risorse inutilizzate dalle librerie?
- 26. Come far sì che gcc avvisi le funzioni sconosciute?
- 27. Android Lint: come sopprimere tutti gli avvisi associati alla libreria di supporto?
- 28. Come sopprimere gli avvisi Perl emessi dal codice di un modulo caricato?
- 29. Rspec: Come sopprimere avvisi e notifiche durante l'esecuzione dei test?
- 30. Precisione richiesta dalle funzioni matematiche GNU GCC?
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. –
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'. –
+1 mi ha aiutato a risolvere i problemi con fastidiosi avvertimenti di boost http://stackoverflow.com/questions/35704753/warnings-from-boost – mrgloom