8

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

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

我得到这个的原因是因为我使用的库是使用default可见性构建的,而我的应用程序是使用hidden可见性构建的。我已经通过重建具有hidden可见性的库来解决这个问题。

不过我的问题是:如果我愿意,我将如何抑制该警告?现在我已经知道如何修复它,这不是我需要做的事情,但我仍然很好奇您将如何抑制该特定警告 - 或一般的任何链接器警告?

-fdiagnostics-show-option用于任何 C/C++/链接器标志并不能像其他编译器警告一样说明该警告的来源。

4

2 回答 2

9

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

但是,您可以像这样将其静音(这是从 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!为您的精彩项目替换为多个空间或一些广告。

于 2015-03-23T07:32:34.417 回答
1

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

于 2013-07-01T00:59:34.297 回答