Как вы подавляете предупреждения компоновщика GCC?
В последнее время я был в крестовом походе по устранению предупреждений из нашего кода и стал более знаком с флагами предупреждений 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 ответа
На самом деле вы не можете отключить предупреждение компоновщика 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!
либо несколькими пробелами, либо рекламой вашего замечательного проекта.
К сожалению, у ld, похоже, нет никакого внутреннего способа подавления определенных опций. Одна вещь, которая мне показалась полезной, заключалась в ограничении количества повторяющихся предупреждений путем передачи -Wl,--warn-once
на g++ (или вы можете пройти --warn-once
непосредственно к л.д.).