2010-08-04 3 views
5

J'ai récemment fait une croisade pour éliminer les avertissements de notre code et je suis devenu plus familier avec les drapeaux d'avertissement GCC (tels que -Wall, -Wno-<warning to disable>, -fdiagnostics-show-option, etc.). Cependant, je n'ai pas été capable de comprendre comment désactiver (ou même contrôler) les avertissements de l'éditeur de liens. L'avertissement de linker le plus courant que je recevais est de la forme suivante:Comment supprimer les avertissements de l'éditeur de liens GCC?

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

La raison pour laquelle je recevais c'était parce que la bibliothèque que j'utilisais a été construit en utilisant la visibilité default alors que mon application est construite avec hidden visibilité. J'ai réparé ceci en reconstruisant la bibliothèque avec hidden visibilité.

Ma question est: comment supprimer cet avertissement si je le voulais? Ce n'est pas quelque chose que je dois faire maintenant que j'ai trouvé comment le réparer mais je suis toujours curieux de savoir comment vous supprimer cet avertissement particulier - ou des avertissements de linker en général? L'utilisation du -fdiagnostics-show-option pour l'un des indicateurs C/C++/linker ne dit pas d'où vient cet avertissement comme avec les autres avertissements du compilateur.

+0

man page pour ld ne dit pas qu'il existe une option pour désactiver les avertissements du linker :( –

Répondre

0

Malheureusement, ld ne semble pas avoir de moyen intrinsèque de supprimer des options spécifiques. Une chose que j'ai trouvé utile était de limiter le nombre d'avertissements en double en passant de -Wl,--warn-once à g ++ (ou vous pouvez passer directement de --warn-once à ld).

4

En fait, vous ne pouvez pas désactiver un avertissement de l'éditeur de liens GCC, car il est stocké dans une section spécifique de la bibliothèque binaire avec laquelle vous liez. (La section est appelée .gnu.warning symbole.)

Vous pouvez toutefois la rendre muette, comme celui-ci (ce qui est extrait de libc-symbols.h):

Sans elle:

#include <sys/stat.h> 

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

donne:

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

invalidantes:

#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; 
} 

donne:

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

Avec cache:

#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; 
} 

donne:

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

Il est évident que, dans ce cas, remplacer Hello world! soit par de multiples espace ou une publicité pour votre merveilleux projet.

Questions connexes