2010-08-04 27 views
5

He estado en una cruzada últimamente para eliminar las advertencias de nuestro código y me he familiarizado con las banderas de advertencia de GCC (como -Wall, -Wno-<warning to disable>, -fdiagnostics-show-option, etc.). Sin embargo, no he podido averiguar cómo desactivar (o incluso controlar) las advertencias del enlazador. La advertencia enlazador más común que estaba recibiendo es de la siguiente forma:¿Cómo se suprimen las advertencias del enlazador GCC?

ld: warning: <some symbol> has different visibility (default) in 
<path/to/library.a> and (hidden) in <path/to/my/class.o> 

La razón por la que estaba haciendo esto se debió a la biblioteca que estaba usando se construyó usando la visibilidad default mientras mi aplicación está construida con hidden visibilidad. Lo solucioné reconstruyendo la biblioteca con visibilidad de hidden.

Mi pregunta es: ¿cómo podría suprimir esa advertencia si quisiera? No es algo que tenga que hacer ahora que he descubierto cómo solucionarlo, pero aún siento curiosidad por saber cómo suprimirías esa advertencia en particular, ¿o alguna advertencia de linker en general?

El uso del -fdiagnostics-show-option para cualquiera de los indicadores de C/C++/linker no indica de dónde viene esa advertencia, como con otras advertencias del compilador.

+0

página de manual para ld no dice que haya ninguna opción para desactivar las advertencias del enlazador :( –

Respuesta

0

Desafortunadamente ld no parece tener ninguna forma intrínseca de suprimir opciones específicas. Una cosa que encontré útil fue limitar el número de advertencias duplicadas pasando -Wl,--warn-once a g ++ (o puede pasar --warn-once directamente a ld).

4

En realidad, no se puede deshabilitar una advertencia del enlazador GCC, ya que se almacena en una sección específica de la biblioteca binaria con la que se está enlazando. (La sección se llama .gnu.warning símbolo.)

sin embargo, puede silenciar que, como este (esto se extrae de libc-symbols.h):

Sin ella:

#include <sys/stat.h> 

int main() 
{ 
    lchmod("/path/to/whatever", 0666); 
    return 0; 
} 

Da:

$ gcc a.c 
/tmp/cc0TGjC8.o: in function « main »: 
a.c:(.text+0xf): WARNING: lchmod is not implemented and will always fail 

Con la desactivación:

#include <sys/stat.h> 

/* We want the .gnu.warning.SYMBOL section to be unallocated. */ 
#define __make_section_unallocated(section_string) \ 
    __asm__ (".section " section_string "\n\t.previous"); 

/* When a reference to SYMBOL is encountered, the linker will emit a 
    warning message MSG. */ 
#define silent_warning(symbol) \ 
    __make_section_unallocated (".gnu.warning." #symbol) 

silent_warning(lchmod) 

int main() 
{ 
    lchmod("/path/to/whatever", 0666); 
    return 0; 
} 

da:

$ gcc a.c 
/tmp/cc195eKj.o: in function « main »: 
a.c:(.text+0xf): WARNING: 

Con escondite:

#include <sys/stat.h> 

#define __hide_section_warning(section_string) \ 
    __asm__ (".section " section_string "\n.string \"\rHello world!      \"\n\t.previous"); 

/* If you want to hide the linker's output */ 
#define hide_warning(symbol) \ 
    __hide_section_warning (".gnu.warning." #symbol) 


hide_warning(lchmod) 

int main() 
{ 
    lchmod("/path/to/whatever", 0666); 
    return 0; 
} 

da:

$ gcc a.c 
/tmp/cc195eKj.o: in function « main »: 
Hello world! 

Obviamente, en ese caso, reemplace Hello world! ya sea por espacio múltiple o algún anuncio para su maravillosa proyecto.

Cuestiones relacionadas