¿Cómo suprimir las advertencias de GCC de los encabezados de la biblioteca?


126

Tengo un proyecto que utiliza bibliotecas log4cxx, boost, etc., cuyos encabezados generan muchas advertencias (repetitivas). ¿Hay alguna forma de suprimir las advertencias de la biblioteca incluye (es decir, #include <some-header.h>) o incluye ciertas rutas? Me gustaría usar -Wall y / o -Wextra como de costumbre en el código del proyecto sin que se oculte información relevante. Actualmente uso grep en make output pero me gustaría algo mejor.

Respuestas:


127

Puede intentar incluir encabezados de biblioteca usando en -isystemlugar de -I. Esto los convertirá en "encabezados del sistema" y GCC no informará advertencias para ellos.


11
Si está tratando de hacer esto en XCode, pegue la ruta del sistema en sus "otros indicadores de C ++" en los "indicadores del compilador personalizado" en la configuración de compilación de destino.
Matt Parkins

3
Una desventaja potencial es que en algunas plataformas, g ++ incluirá automáticamente los encabezados del sistema extern "C", lo que generará errores extraños sobre el enlace C si tiene #includeun encabezado C ++ en una -isystemruta.
Tavian Barnes

1
+1 me ayudó a resolver problemas con las molestas advertencias de impulso stackoverflow.com/questions/35704753/warnings-from-boost
mrgloom el

3
¿Por qué esto tiene tantos votos más que la propia respuesta del OP que dice exactamente lo mismo 1.5 horas antes?
underscore_d

1
Para Xcode: ¿Qué sucede si no hubiera una ruta de carpeta en "Otros indicadores de C ++" en mi configuración de compilación de destino? ¿Podría alguien dar más detalles sobre estas soluciones?
Ossir

107

Para aquellos que usan CMake, puede modificar sus include_directoriesdirectivas para incluir el símbolo SYSTEMque suprime las advertencias contra dichos encabezados.

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

¿Qué sucede si la biblioteca proporciona una ${LIBFOO_USE_FILE}variable que se utilizará con el comando include () de CMake ?
waldyrious

2
Esto parece ser casi la solución a mi problema. Tengo 1.) un objetivo binario, que depende de 2.) un objetivo de encabezado solo escrito por mí mismo, que depende de 3.) algunas bibliotecas externas. No tengo idea de cómo obtener advertencias solo para 1 y 2. Tienes alguna idea?
knedlsepp

2
No parece funcionar Intenté esto con un proyecto que usa easylogging++y recibo la misma gran cantidad de advertencias easylogging++.ha pesar de que la carpeta donde reside se ha incluido con la SYSTEMopción.
rbaleksandar

Muchas gracias por esto. Me ha salvado de páginas y páginas de advertencias.
Svalorzen

1
El mismo comentario que para la respuesta aceptada: esta es una mala práctica para mí.
Raffi

55

Puedes usar pragmas. Por ejemplo:

// 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
Solo disponible con GCC> = 4.6
Caduchon

1
Me encanta la capacidad de pragmas push / pop. Recuerdo algo como para Java disponible hace años y estar frustrado / celoso por C / C ++. me encanta que este está disponible engcc
Trevor Boyd Smith

@TrevorBoydSmith MS también clha tenido la capacidad durante años ... A veces gcces un poco lento para adaptarse.
Alexis Wilke

29

Encontré el truco. Para la biblioteca incluye, en lugar de -Idirusar -isystem diren el archivo MAKE. GCC luego trata el impulso, etc., ya que el sistema incluye e ignora cualquier advertencia de ellos.


Tenga en cuenta que si usa un encabezado precompilado, debe agregar el indicador cuando compila tanto el encabezado como el código.
user202729

9

#pragmason instrucciones para el compilador. puede configurar algo antes del #include y deshabilitarlo después.

También puedes hacerlo en la línea de comando .

Otra página de GCC específicamente sobre la desactivación de advertencias .

Optaría por usar # pragma's dentro del código fuente y luego proporcionaría una razón sólida (como comentario) de por qué está deshabilitando las advertencias. Esto significaría razonar sobre los archivos de encabezados.

GCC aborda esto clasificando los tipos de advertencia. Puede clasificarlos como advertencias o ignorarlos. Los artículos vinculados anteriormente le mostrarán qué advertencias se pueden deshabilitar.

Nota: también puede dar masajes al código fuente para evitar ciertas advertencias mediante el uso de atributos ; sin embargo, esto te une bastante a GCC.

Nota 2: GCC también usa la interfaz pop / push como se usa en el compilador de microsoft: Microsoft deshabilita las advertencias a través de esta interfaz. Le sugiero que investigue esto más a fondo, ya que no sé si es posible.


Consideré los pragmas, pero si elimino una advertencia antes de incluir un encabezado, ¿cómo lo configuro al estado anterior después de #include? Quiero ver todas las advertencias para el código del proyecto (ya me ayudó algunas veces) pero tengo el control desde la línea de comandos.
AdSR

4

Puede intentar usar encabezados precompilados . Las advertencias no desaparecerán, pero al menos no aparecerán en su compilación principal.


1
Esto podría ser una buena idea. Los servicios de terceros no cambian todos los días.
AdSR

Exactamente. Aunque no los he usado tanto en Linux, funcionan bastante bien en Visual Studio.
Pablo Santa Cruz

No, seguirán apareciendo en la compilación a menos que use otra forma de suprimirlos (por ejemplo -isystem, pero recuerde usarlo tanto en la compilación del encabezado como en el código)
user202729


1

Poniendo lo siguiente

#pragma GCC system_header

desactivará las advertencias de GCC para todos los siguientes códigos en este archivo.


-9

Debe haber razones para esas advertencias. Estos serán causados ​​por errores en el código que usa la biblioteca o por errores en el código de la biblioteca. En el primer caso, arregle su código. En el segundo caso, deja de usar la biblioteca o, si es código FOSS, arréglalo.


+1 para un buen consejo: D pero pregunta cómo hacer algo específico: D
Hassan Syed

44
Algunas advertencias son imposibles o muy difíciles de solucionar, especialmente en código de terceros, especialmente en código rico en metaprogramación como el de Boost.
ulidtko

3
Peor aún, el que me está molestando es la "declaración de 'c' sombras de un miembro de 'this' [-Werror = shadow]" profundo, profundo en algún encabezado de impulso. Eso ciertamente no es un problema, pero problemas similares y similares están arrojando resultados y dificultando que encuentre instancias un sombreado real en nuestra base de código.
dmckee --- ex gatito moderador
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.