लाइब्रेरी हेडर से जीसीसी चेतावनियों को कैसे दबाएं?


126

मेरे पास एक प्रोजेक्ट है जो log4cxx, बूस्ट इत्यादि पुस्तकालयों का उपयोग करता है जिनके हेडर बहुत सारे (दोहराए जाने वाले) चेतावनी उत्पन्न करते हैं। क्या लाइब्रेरी से चेतावनी को दबाने का एक तरीका है (यानी #include <some-header.h>) या कुछ निश्चित रास्तों से शामिल है? मैं उपयोग करना चाहूंगा -वैल और / या -वैक्रा पर हमेशा की तरह प्रोजेक्ट कोड पर संबंधित जानकारी अस्पष्ट किए बिना। मैं वर्तमान में आउटपुट बनाने पर grep का उपयोग करता हूं, लेकिन मुझे कुछ बेहतर चाहिए।

जवाबों:


127

आप लाइब्रेरी हेडर का उपयोग -isystemकरने के बजाय शामिल करने का प्रयास कर सकते हैं -I। यह उन्हें "सिस्टम हेडर" बना देगा और जीसीसी उनके लिए चेतावनी की रिपोर्ट नहीं करेगा।


11
यदि आप XCode में ऐसा करने का प्रयास कर रहे हैं, तो अपने लक्ष्य निर्माण सेटिंग्स में "कस्टम कंपाइलर झंडे" में अपने "अन्य C ++ झंडे" में छड़ी-तंत्र प्रणाली।
मैट पार्किन्स

3
एक संभावित नकारात्मक पक्ष यह है कि कुछ प्लेटफार्मों पर, जी ++ स्वचालित रूप से किसी भी सिस्टम हेडर को लपेट देगा extern "C", जिससे सी लिंकेज के बारे में अजीब त्रुटियां हो सकती हैं यदि आप #includeएक -isystemपथ में सी ++ हेडर रखते हैं ।
तवियन बार्न्स

1
+1 ने मुझे गुस्सा बढ़ाने वाली चेतावनियों के साथ समस्याओं को हल करने में मदद की। stackoverflow.com/questions/35704753/warnings-from-boost
mrgloom

3
ओपी के स्वयं के उत्तर की तुलना में इसके पास इतने अधिक वोट क्यों हैं जो ठीक 1.5 घंटे पहले एक ही बात कही थी?
अंडरस्कोर_ड

1
Xcode के लिए: क्या होगा अगर मेरे लक्ष्य निर्माण सेटिंग्स में "अन्य C ++ झंडे" में कोई फ़ोल्डर पथ नहीं था? क्या कोई इस समाधान के बारे में विस्तार से बता सकता है?
ओसिर

107

सीएमके का उपयोग करने वालों के लिए, आप अपने include_directoriesनिर्देशों को संशोधित कर सकते हैं ताकि प्रतीक को शामिल किया जा सके SYSTEMजो ऐसे हेडर के खिलाफ चेतावनी को दबाता है।

include_directories(SYSTEM "${LIB_DIR}/Include")
                    ^^^^^^

क्या होगा यदि पुस्तकालय ${LIBFOO_USE_FILE}सीएमके के शामिल () कमांड के साथ उपयोग होने वाला एक चर प्रदान करता है ?
वाल्ड्रियस

2
यह मेरी समस्या का लगभग समाधान प्रतीत होता है। मेरे पास 1.) एक बाइनरी टारगेट है, जो 2. पर निर्भर करता है।) एक हेडर केवल स्वयं द्वारा लिखा गया टारगेट होता है, जो कि 3.) कुछ बाहरी पुस्तकालयों पर निर्भर करता है। मुझे नहीं पता कि केवल 1 और 2 के लिए चेतावनी कैसे प्राप्त करें। आपके पास कोई विचार है?
knedlsepp

2
काम करने के लिए प्रतीत नहीं होता है। मैंने इसे एक प्रोजेक्ट के साथ आज़माया है जो उपयोग करता है easylogging++और मुझे easylogging++.hउस फ़ोल्डर से भी बड़ी मात्रा में चेतावनी मिलती है, जहाँ वह रहता है, जिसमें SYSTEMविकल्प के रूप में शामिल किया गया है ।
rbaleksandar

इस लिए आपका बहुत - बहुत धन्यवाद। इसने मुझे पन्नों और चेतावनियों से बचाया है।
स्वावलोरन

1
स्वीकृत उत्तर के लिए भी यही टिप्पणी करें: यह मेरे लिए बुरा व्यवहार है।
रफी

55

आप प्रैग्मैस का उपयोग कर सकते हैं। उदाहरण के लिए:

// save diagnostic state
#pragma GCC diagnostic push 

// turn off the specific warning. Can also use "-Wall"
#pragma GCC diagnostic ignored "-Wunused-but-set-variable"

#include <boost/uuid/uuid.hpp>
#include <boost/uuid/uuid_generators.hpp>
#include <boost/uuid/uuid_io.hpp>
#include <boost/lexical_cast.hpp>

// turn the warnings back on
#pragma GCC diagnostic pop

3
केवल GCC के साथ उपलब्ध है = = 4.6
Caduchon

1
मैं पुश / पॉप प्रागमस की क्षमता से प्यार करता हूं। मुझे याद है कुछ साल पहले उपलब्ध जावा के लिए और सी / सी ++ के लिए निराश / ईर्ष्या के साथ। मुझे यह पसंद है कि यह उपलब्ध हैgcc
ट्रेवर बॉयड स्मिथ

@TrevorBoydSmith MS clमें वर्षों से क्षमता है ... कई बार gccअनुकूलित करने के लिए थोड़ा धीमा होता है।
एलेक्सिस विल्के

29

मैंने तरकीब खोज ली। लाइब्रेरी के लिए मेकफाइल में -Idirउपयोग के बजाय शामिल है -isystem dir। जीसीसी तब बढ़ावा आदि का इलाज करता है क्योंकि सिस्टम में शामिल है और उनसे किसी भी चेतावनी को अनदेखा करता है।


ध्यान दें कि यदि आप पूर्वनिर्धारित हेडर का उपयोग करते हैं तो आपको हेडर और कोड दोनों को संकलित करते समय ध्वज को जोड़ने की आवश्यकता होती है।
user202729

9

#pragmaसंकलक को निर्देश हैं। आप #include से पहले कुछ सेट कर सकते हैं और उसके बाद इसे निष्क्रिय कर सकते हैं।

आप इसे कमांड लाइन पर भी कर सकते हैं ।

विशेष रूप से चेतावनियों को अक्षम करने पर एक और जीसीसी पृष्ठ ।

मैं स्रोत कोड के भीतर # प्राग्मा का उपयोग करने के विकल्प के लिए जाऊंगा, और फिर आपको चेतावनी देने में अक्षम होने का एक ध्वनि कारण (एक टिप्पणी के रूप में) प्रदान कर रहा हूं। इसका मतलब हेडर फ़ाइलों के बारे में तर्क देना होगा।

जीसीसी ने चेतावनी के प्रकारों को वर्गीकृत करके यह दृष्टिकोण किया । आप उन्हें चेतावनी देने या नजरअंदाज करने के लिए वर्गीकृत कर सकते हैं। पहले से लिंक किए गए लेख आपको दिखाएंगे कि कौन सी चेतावनियाँ अक्षम हो सकती हैं।

नोट: आप विशेषताओं का उपयोग करके कुछ चेतावनियों को रोकने के लिए स्रोत कोड की मालिश भी कर सकते हैं ; हालाँकि, यह आपको GCC से काफी निकटता से बाँधता है।

नोट 2: जीसीसी पॉप / पुश इंटरफेस का उपयोग भी करता है जैसा कि माइक्रोसॉफ्ट के कंपाइलर में उपयोग किया जाता है - माइक्रोसॉफ्ट इस इंटरफेस के माध्यम से चेतावनी को निष्क्रिय करता है। मेरा सुझाव है कि आप इसकी जांच करें, क्योंकि मुझे नहीं पता कि क्या यह संभव है।


मैंने विचार किया, लेकिन अगर मैंने शीर्ष लेख को शामिल करने से पहले एक चेतावनी को दबा दिया है, तो मैं इसे #include के बाद पिछली स्थिति में कैसे सेट करूं ? मैं प्रोजेक्ट कोड के लिए सभी चेतावनियों को देखना चाहता हूं (मुझे पहले से ही कुछ बार मदद की) लेकिन कमांड लाइन से नियंत्रण है।
AdSR

4

आप पहले से तैयार हेडर का उपयोग करके देख सकते हैं । चेतावनियाँ दूर नहीं जाएंगी, लेकिन कम से कम आपके मुख्य संकलन में दिखाई नहीं देंगी।


1
यह वास्तव में एक अच्छा विचार हो सकता है। तृतीय-पक्ष में हर दिन परिवर्तन शामिल नहीं है।
AdSR

बिल्कुल सही। हालाँकि मैंने उन्हें लिनक्स में इतना इस्तेमाल नहीं किया है, लेकिन वे विजुअल स्टूडियो पर बहुत अच्छा काम करते हैं।
पाब्लो सांता क्रूज़ 15

नहीं, वे तब भी संकलन में दिखाई देंगे जब तक आप उन्हें दबाने के लिए किसी अन्य तरीके का उपयोग नहीं करते (जैसे कि -isystem, लेकिन हेडर और कोड में दोनों का उपयोग करने के लिए याद रखें)
user202729

2

यदि आपको किसी सिस्टम हेडर को स्पष्ट रूप से ओवरराइड करने की आवश्यकता है तो आप प्रैग्मस में प्रतिबंधित हैं। आप सत्यापित कर सकते हैं कि आप make dependआउटपुट के माध्यम से किसका उपयोग कर रहे हैं ।

इसके अलावा gcc> = 4.6 के लिए डायग्नोस्टिक पुश-पॉप देखें


1

निम्नलिखित डाल रहा है

#pragma GCC system_header

इस फ़ाइल में सभी निम्नलिखित कोड के लिए जीसीसी चेतावनी को बंद कर देगा।


-9

उन चेतावनियों का कारण होना चाहिए। ये या तो आपके कोड में त्रुटियों के कारण होंगे जो लाइब्रेरी का उपयोग करते हैं, या लाइब्रेरी कोड में त्रुटियों के कारण। पहले मामले में, अपना कोड ठीक करें। दूसरे मामले में, या तो पुस्तकालय का उपयोग बंद कर दें या यदि यह FOSS कोड है, तो इसे ठीक करें।


अच्छी सलाह के लिए +1: D लेकिन वह पूछ रहा है कि कुछ विशिष्ट कैसे करें: D
हसन सैयद

4
कुछ चेतावनियों को ठीक करना बहुत मुश्किल या मुश्किल है, खासकर 3-पार्टी कोड में, विशेष रूप से ऐसे मेटाप्रोग्रामिंग-रिच कोड में बोअर्स के रूप में।
ulidtko

3
इससे भी बुरी बात यह है कि जो मुझे परेशान कर रहा है, वह है 'ग' छाया की घोषणा 'यह' का सदस्य है [-वर = छाया] गहरी, कुछ बूस्ट हेडर में गहरी। यह निश्चित रूप से कोई समस्या नहीं है, लेकिन यह और इसी तरह के मुद्दे आउटपुट को उगल रहे हैं और मेरे लिए हमारे कोड-बेस में वास्तविक छायांकन को खोजने के लिए कठिन बना रहे हैं।
dmckee --- पूर्व-संचालक बिल्ली का बच्चा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.