विजुअल C ++: विशिष्ट लिंकर चेतावनी को कैसे निष्क्रिय करें?


118

मैं CGAL से एक लाइब्रेरी का उपयोग कर रहा हूं, जो मेरे कोड संकलन के लिंकिंग चरण के दौरान इस फॉर्म की लिंकिंग चेतावनियों का एक बहुत उत्पादन करता है:

warning LNK4099: PDB 'vc80.pdb' was not found with 'gmp-vc80-mt-sgd.lib' or at 'vc80.pdb'; linking object as if no debug info

मैं दृश्य C ++ / Studio 2008 के तहत इस विशिष्ट लिंकर चेतावनी को कैसे बंद कर दूं?

ध्यान दें कि बाहरी (CGAL) लाइब्रेरी पर मेरा कोई नियंत्रण नहीं है जिसका मैं उपयोग कर रहा हूं। मैं बाहरी लाइब्रेरी को फिर से शुरू करने में मदद नहीं कर सकता / करना नहीं चाहता। इसलिए, मेरे अंत में संदेशों को ठीक करने की आवश्यकता है।


1
VS2005 / उपेक्षा के लिए: 4099 ठीक काम करता है।

/ अनदेखा करें: 4099 यहाँ VS2008 के साथ ठीक काम करता है।
टॉम

/ignore:4099C ++ के साथ Visual Studio 10 में ठीक काम करता है। मुझे चेतावनी मिली और मैं LNK4099: PDB 'vc100.pdb' was not found with 'gtest_main-mdd.lib(gtest_main.obj)इसे इस तरह से हटाने में कामयाब रहा।
मनोबल


3
VS2013 स्वीकार / उपेक्षा: 4099 बस ठीक है :)
mlvljr

जवाबों:


101

अतिरिक्त लिंकर विकल्प के रूप में निम्नलिखित जोड़ें:

 /ignore:4099

यह गुण-> लिंकर-> कमांड लाइन में है


5
मुझे नहीं लगता / उपेक्षा मौजूद है। त्रुटियों को अभी भी सूचीबद्ध किया गया है, और / अनदेखी MSDN में प्रलेखित नहीं है। मैं "चेतावनी LNK4075: '/ EDITANDCONTINUE की अनदेखी' / INCREMENTAL: NO 'विनिर्देशन के कारण 4075 को अक्षम करने का प्रयास कर रहा हूं।"
निक डेसजार्दिन्स

1
/ IGNORE प्रलेखित नहीं है, लेकिन उपलब्ध है। देखें connect.microsoft.com/VisualStudio/feedback/details/176188/...
हारून Saarela


7
आप लिंकर फ़्लैग के रूप में 4099 का उपयोग / उपेक्षा कर सकते हैं, लेकिन एक पकड़ है। दुर्भाग्य से, Microsoft ने 4099 को एक गैर-अज्ञानी चेतावनी देने का फैसला किया, इसलिए आपको link.exe पैच करना होगा। थोड़े पागल लग रहे हैं, लेकिन कोई अन्य तरीका नहीं है। यहाँ अधिक विवरण: Bottledlight.com/docs/lnk4099.html मैंने HxD का उपयोग एक हेक्स संपादक के रूप में किया था, और उस पृष्ठ पर वर्णन के बाद VS10 के साथ ठीक काम किया। यह आदेश अभी भी 4088, 4099, 4105 है।
एंड्रियास हेफरबर्ग

2
वीएस 2015 पर काम करता है (परियोजना VS2013 टूलसेट का उपयोग कर रही है, निश्चित नहीं कि अगर इससे कोई फर्क पड़ता है)
एसिमिलाटर

50

अपडेट 2018-10-16

कथित तौर पर, वीएस 2013 के रूप में, यह चेतावनी अक्षम की जा सकती है। @Mark Ransom की टिप्पणी देखें।

मूल उत्तर

आप उस विशिष्ट चेतावनी को अक्षम नहीं कर सकते।

ज्योफ चैपल के अनुसार 4099 की चेतावनी को माना जाता है, हालांकि इसे अनदेखा करना बहुत महत्वपूर्ण है, यहां तक ​​कि / wx के साथ संयोजन के रूप में उपयोग करके (जो चेतावनी को त्रुटियों के रूप में मानेंगे और अन्य स्थितियों में निर्दिष्ट चेतावनी की उपेक्षा करेंगे)

यहाँ लिंक से प्रासंगिक पाठ है:

नॉट अनटाइटेबल वार्निंग

कुछ चेतावनी संख्याओं के लिए, एक / अनदेखी विकल्प में विनिर्देश स्वीकार किया जाता है, लेकिन जरूरी नहीं कि उस पर कार्रवाई की जाए। क्या चेतावनी तब होती है जब / wx विकल्प सक्रिय नहीं होता है, तब भी चेतावनी संदेश प्रदर्शित होता है, लेकिन यदि / wx विकल्प सक्रिय है, तो चेतावनी को अनदेखा कर दिया जाता है। यह वैसा ही है जैसे चेतावनी को नजरअंदाज करने के प्रयास को ओवरराइड करने के लिए पर्याप्त महत्वपूर्ण माना जाता है, लेकिन यह नहीं कि यदि उपयोगकर्ता ने बिना किसी चेतावनी के बहुत अधिक कीमत लगाई है।

निम्नलिखित चेतावनी संख्याएं प्रभावित होती हैं:

4200, 4203, 4204, 4205, 4206, 4207, 4208, 4209, 4219, 4231 and 4237

वह यह नहीं कहता है कि "4099 चेतावनी को अनदेखा करना बहुत महत्वपूर्ण है"; वह इसे इस तथ्य से संक्रमित करता है कि इसे बंद नहीं किया जा सकता है। (उस लिंक पर शून्य अतिरिक्त जानकारी होने के बाद से यहां नोट किया गया है।)
बेन एम

आपकी चिंता को दूर करने के लिए अपडेट किया गया है @BenM
जॉन वेल्डन

1
यह उत्तर पुराना है , 4099 चेतावनी को अक्षम करने पर मेरे लिए VS2017 पर ठीक काम हुआ। यह यहाँ टिप्पणियों से प्रतीत होता है कि इसे अक्षम किया जा सकता है शायद VS2013 से शुरू।
मार्क रैनसम

10

(रिकॉर्ड के लिए और इससे पहले कि थ्रेड गायब हो जाए msdn मंचों पर) आप चेतावनी को अक्षम नहीं कर सकते (कम से कम VS2010 के तहत) क्योंकि यह उन चेतावनियों की सूची में है, जिन्हें निष्क्रिय नहीं किया जा सकता (इसलिए / wd4099 काम नहीं करेगा) , लेकिन आप इसके बजाय क्या कर सकते हैं पैच लिंक। exe (आमतौर पर C: \ Program Files (x86) \ Microsoft दृश्य स्टूडियो 10.0 \ VC \ bin \ link.exe) इसे कहा सूची से हटाने के लिए। एक जैकहैमर की तरह लगता है, मुझे पता है। हालांकि यह काम करता है।

उदाहरण के लिए, यदि आप 4099 के लिए चेतावनी निकालना चाहते हैं, तो एक हेक्स एडिटर के साथ link.exe खोलें, गोटो लाइन 15A0 जो 03 10 (4099 के लिए थोड़ा एंडियन) को पढ़ता है और इसे FF 00 (जो मौजूद नहीं है) के साथ बदलें।


5
आपको क्रम F8 0F 00 00 - 03 10 00 00 - 09 10 00 00 (4088, 4099, 4105 के रूप में 32 छोटे शब्दों में छोटे एंडियन में) की तलाश करनी चाहिए। यह amd64 / link.exe में समान है।
एंड्रियास हैफेरबर्ग

8

दूसरों के लाभ के लिए, हालांकि मैं इसमें शामिल था कि मैंने क्या किया।

चूंकि आपको LNK4204 चेतावनियों को नजरअंदाज करने के लिए विजुअल स्टूडियो (मेरे मामले में 2010) नहीं मिल सकता है, मेरा दृष्टिकोण इसे वही देना था जो यह चाहता था: पीडीबी फाइलें। जैसा कि मैं अपने मामले में खुले स्रोत पुस्तकालयों का उपयोग कर रहा था, मेरे पास पहले से ही पीडीबी फ़ाइलों का निर्माण करने वाला कोड है।

लेकिन, डिफ़ॉल्ट सभी पीडीएफ फाइलों को एक ही नाम देना है: vc100.pdb मेरे मामले में। जैसा कि आपको प्रत्येक .lib के लिए एक .pdb की आवश्यकता होती है, यह एक समस्या पैदा करता है, खासकर यदि आप ImageMagik जैसी किसी चीज का उपयोग कर रहे हैं, जो लगभग 20 स्थिर .lib फाइलें बनाता है। आपके पास एक निर्देशिका में 20 काम करने योग्य फाइलें नहीं हो सकती हैं (जो आपके एप्लिकेशन के लिंकर से पुस्तकालयों में लिंक करने के लिए संदर्भ है) और सभी 20 .pdb फ़ाइलों को एक ही चीज़ कहते हैं।

मेरा समाधान यह था कि मैं अपनी स्थिर लाइब्रेरी फ़ाइलों को जाऊं और पुनर्निर्माण करूं, और PRO201ECT के संबंध में .pdb फ़ाइल को नाम देने के लिए VS2010 को कॉन्फ़िगर करूं। इस तरह, प्रत्येक .lib का एक समान नाम .pdb मिलता है, और आप अपनी परियोजना के उपयोग के लिए सभी LIB और PDBs को एक निर्देशिका में रख सकते हैं।

तो "डीबग" विन्यास के लिए, मैंने संपादित किया:

गुण-> कॉन्फ़िगरेशन गुण -> C / C ++ -> आउटपुट फ़ाइलें -> प्रोग्राम डेटाबेस फ़ाइल नाम से

$ (IntDir) कुलपति $ (PlatformToolsetVersion) .pdb

निम्नलिखित मान होना चाहिए:

$ (OutDir) कुलपति $ (PlatformToolsetVersion) डी $ (ProjectName) .pdb

अब इंटरमीडिएट डायरेक्टरी में कहीं न कहीं .pdb फाइल्स को आउटपुट डायरेक्टरी में लिखा जाता है, जहाँ .lib फाइल्स भी लिखी जा रही हैं, और सबसे महत्वपूर्ण बात यह है कि उन्हें डी + प्रोजेक्ट नाम के एक प्रत्यय के साथ नाम दिया गया है । इसका मतलब यह है कि प्रत्येक पुस्तकालय परियोजना एक .lib और एक परियोजना विशिष्ट .pdb को स्पष्ट करती है।

अब मैं अपनी सभी रिलीज़ .लिब फ़ाइल्स, मेरी डिबग .लिब फ़ाइल्स और डीबग .pdb फ़ाइलों को अपने डेवलपमेंट सिस्टम पर एक स्थान पर कॉपी करने में सक्षम हूँ, और वह प्रोजेक्ट जो डीबग मोड में उस 3 पार्टी लाइब्रेरी का उपयोग करता है, में pdb है फ़ाइलें इसे डिबग मोड में चाहिए।


2
मैं कहूंगा कि यह सवाल का जवाब है। जिस लिंक पर PATCHING का सुझाव है, उसमें कई उत्तर सम्‍मिलित हैं। भले ही Microsoft इस चेतावनी को अनभिज्ञ बनाने के बारे में "गलत" हो।
तमसे सजेलेई

3
यह उचित उत्तर है यदि आप पुस्तकालय को स्रोत से संकलित कर रहे हैं। लेकिन कुछ कार्यक्रमों में वाणिज्यिक पुस्तकालयों पर निर्भरता होती है, जिसमें .pdb फाइलें शामिल नहीं होती हैं, इसलिए उनके लिए .pdb फाइल बनाना एक विकल्प नहीं है।
ब्रायस वैगनर 19

3

मुझे संदेह है / उपेक्षा एक VC6 link.exe विकल्प है। VS2005 और VS2008 के लिंकर के लिए कोई दस्तावेज / अनदेखी विकल्प उपलब्ध नहीं है, लेकिन लिंकर सिर्फ "/ उपेक्षा: XXX" विकल्प को अनदेखा करता है, कोई त्रुटि नहीं और कोई प्रभाव नहीं।


2
वास्तव में, यह लिंकर चेतावनियों को नजरअंदाज न करने के लिए उत्साहित है, इसलिए VC6 के बाद अनदेखा ध्वज को अक्षम कर दिया गया: bytes.com/topic/net/answers/…
Gyuri

/ नजरअंदाज VS2013 में फिर से इस्तेमाल किया जा सकता है।
फर्नांडो गोंजालेज सांचेज

1

PDB फ़ाइल आमतौर पर डिबग जानकारी संग्रहीत करने के लिए उपयोग की जाती है। यह चेतावनी संभवतः इसलिए लगी है क्योंकि vc80.pdbलक्ष्य ऑब्जेक्ट फ़ाइल को लिंक करते समय फ़ाइल नहीं मिली है। LNK4099 पर MSDN प्रविष्टि पढ़ें यहाँ

वैकल्पिक रूप से, आप प्रोजेक्ट गुण> लिंकर> डिबगिंग> डीबग जानकारी क्षेत्र से डिबग सूचना पीढ़ी को बंद कर सकते हैं।


3
डिबग जानकारी को बंद करना लिंकर की चेतावनियों को हल करता है, लेकिन फिर ब्रेकपॉइंट डिबग जानकारी के बिना काम नहीं करता है। यह मेरे लिए बहुत उपयोगी नहीं है।
अश्विन नांजप्पा

2
चेतावनी को बंद करना कभी सही काम नहीं है। उन्हें ठीक करें। आपको pdb ढूंढने की जरूरत है और यह देखना है कि यह उचित स्थान पर कॉपी हो जाता है।
dirkgently

आह, यह सच है! दुख की बात है कि इस मामले में, मुझे वह पीडीबी नहीं मिली।
अश्विन नानप्पा

1
vc80.pdb vc8 के लिए केवल डिफ़ॉल्ट pdb नाम है। इस चेतावनी का सीधा मतलब है कि CGAL लाइब्रेरी के लिए कोई डीबग जानकारी उपलब्ध नहीं है। इसे नजरअंदाज करना सुरक्षित है।
जोजे

1

संपादित करें: vc80 / विजुअल स्टूडियो 2005, लेकिन CGAL पुस्तकालय की विजुअल स्टूडियो 2008 / vc90 संस्करणों (शायद का उपयोग नहीं करते से यहाँ )।

लिंकर उपकरण चेतावनी LNK4099 :

आप / Z7 के साथ भी संकलित कर सकते हैं, इसलिए pdb का उपयोग करने की आवश्यकता नहीं है, या आपके द्वारा लिंक की जा रही ऑब्जेक्ट्स के लिए .pdb फ़ाइलें नहीं होने पर / DEBUG लिंकर विकल्प को हटा दें।


2
धन्यवाद। / Z7 के साथ संकलन करना अभी भी CGAL लाइब्रेरी की .pdb फ़ाइल के लिए पूछता है। / DEBUG लिंकर की चेतावनी को हल करता है, लेकिन तब ब्रेकपॉइंट डिबग जानकारी के बिना काम नहीं करता है।
अश्विन नांजप्पा

1

जैसा कि @John Weldon ने कहा कि आप लिंकर की चेतावनी 4099 को अक्षम नहीं कर सकते।

आपको कुछ प्रोजेक्ट कॉन्फ़िगरेशन परिवर्तन के साथ लाइब्रेरी का पुनर्निर्माण करना चाहिए। आपके पास कई विकल्प हैं:

  • डिबग जानकारी के साथ पीडीबी फ़ाइल सहेजें वही फ़ोल्डर है जहाँ आप .lib फ़ाइल सहेजते हैं। गुण-> C / C ++ -> आउटपुट फाइल-प्रोग्राम डेटाबेस फ़ाइल नाम के लिए "$ (OutDir) $ (TargetName) .pdb" मान सेट करें
  • .Lib फ़ाइल में डिबग जानकारी सहेजें। सेट मान "C7 संगत (/ Z7)" गुण-> C / C ++ -> सामान्य-> डिबग सूचना प्रारूप
  • इस लाइब्रेरी के लिए जनरेशन डिबग जानकारी अक्षम करें। गुण-> C / C ++ -> सामान्य-> डिबग सूचना प्रारूप से मान निकालें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.