Как вы подавляете предупреждения компоновщика GCC? - PullRequest
5 голосов
/ 05 августа 2010

В последнее время я был в крестовом походе, чтобы исключить предупреждения из нашего кода, и стал более знаком с флагами предупреждений 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 ++ / linker не говорит, откуда появилось это предупреждение, как с другими предупреждениями компилятора.

Ответы [ 2 ]

4 голосов
/ 23 марта 2015

На самом деле, вы не можете отключить предупреждение компоновщика 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! либо на несколько пробелов, либо на какую-нибудь рекламу вашего замечательного проекта.

0 голосов
/ 01 июля 2013

К сожалению, в ld, похоже, нет никакого способа подавления определенных опций. Одна вещь, которая мне показалась полезной, это ограничение количества повторяющихся предупреждений путем передачи -Wl,--warn-once в g ++ (или вы можете передать --warn-once непосредственно в ld).

...