2010-07-22 11 views
21

En el proyecto de software en el que estoy trabajando, utilizamos ciertas bibliotecas de terceros que, por desgracia, producen advertencias gcc molestas. Nos esforzamos por limpiar todo el código de advertencias y queremos habilitar el indicador treat-warnings-as-errors (-Werror) en GCC. ¿Hay alguna manera de hacer que estas advertencias generadas por terceros, que no podemos solucionar, desaparezcan?Cómo eliminar advertencias externas de lib/terceros en GCC

+0

¿Qué versión de gcc? –

+0

Greg - gracias, haré. Sam - g ++ 4.1.2 – Michael

Respuesta

14

Supongo que está hablando de las advertencias procedentes de los encabezados de biblioteca de terceros.

La solución específica GCC sería crear otro archivo de cabecera de envoltura que tiene esencialmente las dos líneas:

#pragma GCC system_header 
#include "real_3rd_party_header.h" 

Y el uso de la envoltura en lugar de la cabecera del partido de tercera originales.

Compruebe another SO response detallando el pragma. En esencia, le dice a GCC que esto (con los archivos incluidos recursivamente) es un encabezado del sistema, y ​​no se deben generar mensajes de advertencia.

De lo contrario, no sé cómo se pueden desactivar las advertencias provenientes del código de terceros. Excepto por la fuerza bruta, por supuesto: en el sistema de compilación configure los archivos que se construirán con las advertencias desactivadas.

3

http://www.artima.com/cppsource/codestandards.html

Ejemplo 1: Un archivo de cabecera de terceros. Un archivo de encabezado de biblioteca que no puede cambiar podría contener una construcción que provoca advertencias (probablemente benignas). luego envolver el archivo con su propia versión que #Includes la cabecera original y se apaga de forma selectiva las advertencias ruidosos para que alcance solamente, y luego #Include su envoltorio durante el resto de su proyecto.

34

Uso -isystem Ejemplo:

gcc -I./src/ -isystem /usr/include/boost/ -c file.c -o obj/file.o 

Con -isystem ningún aviso a impulso: D

+3

Esta es una solución mucho mejor que crear envoltorios. –

11

Si está usando CMake, se puede lograr esto mediante la adición SYSTEM a include_directories:

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

He probado esto bajo GCC y funciona muy bien, pero no hace nada bajo MSVC. No es inesperado porque MSVC no parece tener ninguna forma de especificar los directorios de encabezado del sistema (es decir, el sistema de GCC), pero algo a tener en cuenta si necesita compatibilidad con MSVC. – Kevin

+0

No parece hacer nada por mí en Xcode/Clang tampoco. –

Cuestiones relacionadas