2010-08-04 73 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!項目。