2010-08-04 75 views
5

最近我一直在进行一场讨论,以消除我们的代码中的警告,并且已经更熟悉GCC警告标志(例如-Wall,-Wno-<warning to disable>,-fdiagnostics-show-option等)。但是我一直无法弄清楚如何禁用(甚至控制)链接器警告。那我得到的最常见的连接器警告如下形式:你如何抑制GCC链接器警告?

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

我之所以得到这个是因为我使用的库用的是default知名度,而我的应用程序与hidden知名度建成建成。我已通过重建图书馆的hidden知名度来解决此问题。

虽然我的问题是:如果我想要如何抑制该警告?这不是我现在需要做的事情,我已经想出了如何解决这个问题,但我仍然很好奇你是如何抑制这种特定警告的 - 或者一般的链接器警告?

对任何C/C++ /链接器标志使用-fdiagnostics-show-option并没有说明警告来自哪里,像其他编译器警告一样。

+0

ld的手册页不会说有任何选项可以关闭链接器警告:( – 2011-06-19 03:41:02

回答

0

不幸的是,ld似乎没有任何抑制特定选项的内在方法。我发现有用的一件事是通过将-Wl,--warn-once传递给g ++来限制重复警告的数量(或者您可以直接将--warn-once传递给ld)。

4

实际上,您不能禁用GCC链接器警告,因为它存储在您链接的二进制库的特定部分。 (该部分称为.gnu.warning 符号

但是,您可以将其静音,像这样(这是从的libc-symbols.h提取):

没有它:

#include <sys/stat.h> 

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

给出:

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

随着禁用:

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

给出:

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

有了藏身:

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

给出:

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

显然,在这种情况下,可以由多个空间或一些广告为您的精彩更换Hello world!项目。