2011-03-09 17 views
9

से "/ DEFAULTLIB" कहां से आ रहा है यह निर्धारित करने के लिए कि मैं यह निर्धारित करने का एक अच्छा तरीका खोजने का प्रयास कर रहा हूं कि लिंक समय पर कौन सा मॉड्यूल एक निश्चित लाइब्रेरी को "/ DEFAULTLIB" के रूप में संसाधित करने के कारण उत्पन्न कर रहा है विजुअल स्टूडियो से वर्बोज़ लिंकर आउटपुट।लिंकर समस्या:

यहां मेरी स्थिति है, मेरे पास कई स्थिर पुस्तकालय पूर्व-आवश्यकताएं हैं और प्रत्येक में एक रिलीज और डिबग संस्करण (BlahD.lib और Blah.lib) है। लिंक समय पर किसी कारण से * डी.लिब को डिफ़ॉल्ट पुस्तकालयों के रूप में संसाधित किया जाता है, भले ही मैं "अतिरिक्त निर्भरता" के रूप में निर्दिष्ट गैर-डीबग libs के साथ रिलीज का निर्माण कर रहा हूं। यदि मैं स्थिर पुस्तकालयों के डीबग संस्करणों का निर्माण कभी नहीं करता हूं तो * डी फ़ाइलें मौजूद नहीं होंगी और एक लिंकर त्रुटि होगी (फ़ाइल नहीं खोल सकता)।

मैं इन सभी अपमानजनक .lib फ़ाइलों के लिए/NODEFAULTLIB निर्दिष्ट करके सफलतापूर्वक निर्माण करने के लिए अपनी परियोजना प्राप्त कर सकता हूं। सभी रिलीज पुस्तकालयों को लिंक किया गया है और हर कोई खुश है। लेकिन मैं समझना चाहता हूं कि यहां क्या हो रहा है। लिंकर द्वारा इन * डी.लिब फ़ाइलों को संसाधित करने का कारण क्या है? क्या मेरी एकमात्र ऐसी स्क्रिप्ट लिखने की आशा है जो इस विशाल परियोजना और इसकी आश्रित परियोजनाओं (microsoft support) में सब कुछ डंपबिन्स करे? फिर भी मुझे समझ में नहीं आता कि डंपबिन आउटपुट में क्या देखना है, क्या यह .lib फ़ाइलों के साथ-साथ .obj फ़ाइलों पर भी लागू होता है?

उत्तर

5

स्रोत में #pragma comment(lib) के लिए देखो। देखें कि यह शायद #define पर निर्भर है - यह एक एसडीके के लिए एक सामान्य तरीका है कि यह सुनिश्चित करने के लिए कि सही libs जुड़े हुए हैं, और तर्क के लिए आपको THESDK_DEBUG या THESDK_RELEASE परिभाषित करने की आवश्यकता हो सकती है।

अतिरिक्त जानकारी: मैं विजुअल स्टूडियो 2008 है कि भले से * .idl दायर बयान टिप्पणी में खोज की काम नहीं करता है, के रूप में:

//cpp_quote("#pragma comment(lib, \"MYLIB.lib\")") 

संकलक अभी भी रूप में MYLIB.lib कहते हैं एक DEFAULTLIB, और यह * .obj फ़ाइल में हवाओं। सुनिश्चित करें कि आप कोड से पूरी तरह से लाइन हटा दें!

10

मुझे एक ही समस्या थी। जैसा कि आपने सुझाव दिया था, मैं * .obj फ़ाइलों का विश्लेषण करके इसे हल करने में सक्षम था। यह करने के लिए, मैं दृश्य स्टूडियो कमांड प्रॉम्प्ट के माध्यम से निम्न आदेश भाग गया (परियोजना, जहाँ * .obj फ़ाइलें उत्पन्न कर रहे हैं के अस्थायी फ़ोल्डर में):

for /R %1 in (*.obj) do @dumpbin /directives /section:.drectve "%1" > "%1".directives.txt 

तो मैं के नाम के लिए खोज करने के लिए नोटपैड ++ का इस्तेमाल किया इन सभी *directives.txt फ़ाइलों में अपमानजनक लाइब्रेरी। इससे पता चला कि कौन सी परियोजना गलत lib का संदर्भ दे रही थी।

नोट: आप अपनी परियोजना का उपयोग कर सकते हैं किसी भी तृतीय पक्ष * .lib फ़ाइलों को शामिल करने के लिए इसे संशोधित करना चाहते हैं, न केवल * .obj फ़ाइलें। "/ DEFAULTLIB" निर्देश भी उनसे आ सकते हैं।

नोट: यदि आप * ओ बजाय * की /verbose विकल्प के साथ .obj

+0

यदि आप इन आदेशों का समर्थन करने वाली प्रणाली पर हैं, तो आप कमांड लाइन से जेनरेट की गई फ़ाइलों को आसानी से खोज सकते हैं: ढूंढें। -नाम "* .directives.txt" | xargs grep JamesG

+0

मुझे यह विधि सबसे उपयोगी मिली, हालांकि सभी आउटपुट को उसी फ़ाइल में निर्देशित करना आसान पाया क्योंकि मेरे पास कई निर्देशिकाओं में सैकड़ों ऑब्जेक्ट फ़ाइलें हैं। इसके बजाय >> c: \ directives.txt के साथ रीडायरेक्ट करें। – Teknogrebo

+0

उपर्युक्त निर्देशों की तरह लगता है कि ओबीजे और lib फ़ाइलों के भीतर सादे पाठ में आते हैं। इसलिए डंपबिन को कॉल करने की कोई ज़रूरत नहीं है।मेरे लिए बस कमांड लाइन से निम्नलिखित चल रहा है: 'findstr/m/s/c:"/DEFAULTLIB: "" mylib * .obj * .lib' –

0

लिंक और प्रयोग सवाल में पुस्तकालय के नाम के लिए खोज करने के लिए उत्पादन पड़ सकता है। यह आपको बताएगा कि कौन सी ऑब्जेक्ट फ़ाइल ने लाइब्रेरी को लिंक में खींचा है।

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