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ライブラリを可視化して再構築することでこれを修正しました。

ただし、私の質問は次のとおりです。必要に応じて、その警告をどのように抑制しますか? それを修正する方法を見つけたので、今私がする必要があることではありませんが、その特定の警告、または一般的なリンカの警告をどのように抑制するかについてはまだ興味がありますか?

C/C++/linker フラグのいずれかにを使用し-fdiagnostics-show-optionても、他のコンパイラの警告と同様に、その警告がどこから来たのかはわかりません。

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 に答える