2010-08-04 14 views
5

मैं हाल ही में हमारे कोड से चेतावनियों को खत्म करने के लिए एक क्रूसेड पर रहा हूं और जीसीसी चेतावनी झंडे (जैसे -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> 

कारण मैं हो रही थी इस वजह थी कि पुस्तकालय मैं उपयोग कर रहा था, जबकि मेरे आवेदन hidden दृश्यता के साथ बनाया गया है default दृश्यता का उपयोग कर बनाया गया था। मैंने लाइब्रेरी को hidden दृश्यता के साथ पुनर्निर्माण करके इसे ठीक कर दिया है।

मेरा प्रश्न हालांकि है: अगर मैं चाहता हूं तो मैं उस चेतावनी को कैसे दबा दूंगा? ऐसा कुछ ऐसा नहीं है जिसे मुझे अब करने की ज़रूरत है कि मैंने यह पता लगाया है कि इसे कैसे ठीक किया जाए, लेकिन मैं अभी भी उत्सुक हूं कि आप उस विशेष चेतावनी को कैसे दबाएंगे - या सामान्य रूप से कोई लिंकर चेतावनियां?

किसी भी सी/सी ++/लिंकर झंडे के लिए -fdiagnostics-show-option का उपयोग यह नहीं कहता कि यह चेतावनी अन्य कंपाइलर चेतावनियों के साथ कहां से आती है।

+0

एलडी के लिए मैन पेज यह नहीं कहता कि लिंकर चेतावनियों को बंद करने का कोई विकल्प है :( –

उत्तर

0

दुर्भाग्यवश एलडी में विशिष्ट विकल्पों को दबाने का कोई आंतरिक तरीका नहीं दिखता है। एक चीज जिसे मैंने उपयोगी पाया, -Wl,--warn-once को जी ++ में पास करके डुप्लिकेट चेतावनियों की संख्या को सीमित कर रहा था (या आप सीधे --warn-once को ld तक पास कर सकते हैं)।

4

दरअसल, आप एक जीसीसी लिंकर चेतावनी को अक्षम नहीं कर सकते हैं, क्योंकि यह आपके द्वारा लिंक की जा रही बाइनरी लाइब्रेरी के एक विशिष्ट अनुभाग में संग्रहीत है। (खंड कहा जाता है .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; 
} 

देता है:

#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 »: 
a.c:(.text+0xf): WARNING: 
छिपने के साथ

$ gcc a.c 
/tmp/cc195eKj.o: in function « main »: 
Hello world! 

जाहिर है, उस स्थिति में, Hello world! की जगह या तो कई जगह या अपने अद्भुत के लिए कुछ विज्ञापन द्वारा परियोजना।

संबंधित मुद्दे