2010-08-04 49 views
5

Ich war in letzter Zeit auf einem Kreuzzug, um Warnungen aus unserem Code zu beseitigen und vertraut geworden mit GCC-Warnflags (wie -Wall, -Wno-<warning to disable>, -fdiagnostics-show-option, etc.). Ich konnte jedoch nicht herausfinden, wie Linkerwarnungen zu deaktivieren (oder sogar zu steuern). Die häufigste Linker Warnung, dass ich immer ist in der folgenden Form:Wie unterdrücken Sie GCC-Linker-Warnungen?

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

Der Grund war ich immer das war, weil die Bibliothek ich wurde mit der default Sichtbarkeit während meiner Anwendung gebaut wurde mit mit hidden Sichtbarkeit gebaut wird. Ich habe dies behoben, indem ich die Bibliothek mit hidden Sichtbarkeit neu erstellt habe.

Meine Frage ist jedoch: Wie würde ich diese Warnung unterdrücken, wenn ich wollte? Es ist nicht etwas, das ich jetzt tun muss, da ich herausgefunden habe, wie ich es beheben kann, aber ich bin immer noch neugierig, wie Sie diese bestimmte Warnung unterdrücken würden - oder irgendwelche Linkerwarnungen im Allgemeinen?

Die Verwendung der -fdiagnostics-show-option für eines der C/C++/Linker-Flags sagt nicht, woher diese Warnung kommt, wie mit anderen Compiler-Warnungen.

+0

man page für ld sagt nicht, es gibt eine option, um linker warnungen zu deaktivieren :( –

Antwort

0

Leider scheint ld keine intrinsische Möglichkeit zu haben, bestimmte Optionen zu unterdrücken. Eine Sache, die ich nützlich fand, war die Anzahl der doppelten Warnungen zu begrenzen, indem Sie -Wl,--warn-once an g ++ übergeben (oder Sie können --warn-once direkt an ld übergeben).

4

Eigentlich können Sie eine GCC-Linker-Warnung nicht deaktivieren, da sie in einem bestimmten Abschnitt der binären Bibliothek gespeichert ist, mit der Sie verlinken. (Der Abschnitt wird .gnu.warning genannt Symbol.)

Sie können es jedoch stumm zu schalten, wie dies (das aus libc-symbols.h extrahiert):

Ohne sie:

#include <sys/stat.h> 

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

Gibt:

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

Mit Deaktivierung:

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

gibt:

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

Mit Versteck:

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

gibt:

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

Offensichtlich in diesem Fall ersetzen Hello world! entweder durch mehrere Leerzeichen oder eine Anzeige für Ihr wunderbares Projekt.