2009-02-20 18 views
10

मैंने अपने समाधान में एक डीएलएल प्रोजेक्ट जोड़ा और इसे निष्पादन योग्य परियोजना द्वारा स्पष्ट रूप से संदर्भित किया। निष्पादन योग्य शिकायत कर रहा है कि यह lib नहीं मिल सकता है।.lib फ़ाइल नहीं बनाई जा रही है (VS2008)

कोई भी विचार आवश्यक lib फ़ाइल बनाने के लिए प्रोजेक्ट को कैसे सेट करें? और शायद प्रोजेक्ट क्यों नहीं बनाएगा?!

चीयर्स

नोट मैं परियोजना खोज की है और फ़ाइल कहीं भी नहीं बनाया जा रहा है।

उत्तर

12

लिंकर में -> डीएलएल प्रोजेक्ट का उन्नत प्रॉपर्टी टैब, सत्यापित करें कि आयात लाइब्रेरी (जिस .lib फ़ाइल को आप ढूंढ रहे हैं) के लिए मान सही/उचित है। इस संपत्ति का मूल्य निर्धारित करेगा कि आयात पुस्तकालय का नाम क्या है, और जहां लिंकर इसे लिख देगा।

आपको अपनी प्रोजेक्ट में एक आयात परिभाषा फ़ाइल (.def) उत्पन्न करने की आवश्यकता हो सकती है, या अपनी हेडर फाइलों की जांच करनी चाहिए और सुनिश्चित करें कि आपके निर्यात किए गए कार्यों को हेडर फ़ाइल में __declspec (dllexport) क्वालीफायर के साथ टैग किया गया हो। यह आमतौर पर इस तरह के रूप में एक #define द्वारा चालू किए जाने पर:

#ifdef MYAPI_EXPORTS 
#define MYAPI_API __declspec(dllexport) 
#else 
#define MYAPI_API __declspec(dllimport) 
#endif 

void MYAPI_API foo(int bar); 

मूल रूप से आप संकलक dllexport को देखने के लिए जब यह पुस्तकालय बनाने जा रहा है चाहता हूँ, लेकिन dllimport जब अपने ग्राहक कोड हेडर फाइल #including है। यदि विजुअल स्टूडियो ने मूल परियोजना संरचना उत्पन्न की है, तो शायद यह पहले से ही उपयोग करने के लिए एक उपयुक्त # परिभाषित बनाया गया है।

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

+0

मान $ (TargetDir) $ (TargetName) पर सेट है। Lib जो कि मेरे पास प्रोजेक्ट में मौजूद अन्य डीएलएस का वही मान है जो काम करता है। –

+0

यह वास्तव में अजीब बात है, क्या आप आयात लाइब्रेरी निर्दिष्ट करने के लिए मैन्युअल रूप से कमांड लाइन स्विच (कमांड लाइन प्रॉपर्टी शीट में) जोड़ सकते हैं? जैसे /IMPLIB:C:\MyDll.lib? – Jeremy

+0

मैंने जोड़ा कि लिंकर कमांड लाइन और कंपाइलर कमांड लाइन दोनों पर स्विच करें और निर्दिष्ट फ़ाइल नहीं बनाई गई है ... यह सिर्फ lib बनाने के लिए मना कर रहा है! –

1

आप Exe परियोजना में परियोजना गुण में lib फ़ाइल> Linker-> इनपुट चादर शामिल किया।

और यह भी सुनिश्चित करें कि आपने लिंकर टैब में अतिरिक्त संदर्भ शामिल किए हैं।

+0

मैं :( किया लेकिन क्योंकि यह नहीं बनाया जा रहा है कि यह एक मूक बिंदु है? –

+0

क्या libiler lib फ़ाइल बनाते समय कोई त्रुटि फेंक रहा है? lib – Vinay

+0

के लिए $ (आउटडियर) \ $ (ProjectName) स्थान की जांच करें, कोई त्रुटि नहीं डाली जा रही है (अन्यथा शिकायत है कि lib फ़ाइल मौजूद नहीं है) और lib परियोजना में कहीं भी मौजूद नहीं है। –

1

डीएलएल बनाने वाली परियोजना की जांच करें। यदि यह एक .lib का उत्पादन नहीं कर रहा है, तो शायद आपने इसे नहीं बताया है। आप परियोजनाओं के आउटपुट को डीएलएल से एक स्थिर लाइब्रेरी में बदल सकते हैं-> सामान्य-> कॉन्फ़िगरेशन प्रकार (स्टेटिक लाइब्रेरी .lib चुनें)

+0

आप प्रोजेक्ट प्रकार को बदलना चाहते हैं/चाहते हैं। मेरी समझ यह है कि डीएलएस (जो गतिशील रूप से जुड़े नहीं हैं) libs बनाने के लिए है। अन्यथा वे बेकार हैं? –

+0

यदि ऐसा है, तो आपकी संपत्तियां अभी भी गलत हैं। आपको यह जांचना होगा कि आपकी .lib फ़ाइल कहां जा रही है। यदि यह सब समस्या है, तो गुण-> लिंकर-> आयात लाइब्रेरी की जांच करें, और देखें कि आप अपनी lib फ़ाइल कहां बना रहे हैं। –

+0

इसका सेट $ (TargetDir) $ (TargetName) .lib जो समाधान में अन्य डीएलएस के समान सेटिंग है जो ठीक काम करता है। –

4

मैंने इसे पहले देखा है। और वास्तव में हाल ही में हिट है हाल ही में। यदि कोई भी निर्यात नहीं किया जाता है तो ए .lib फ़ाइल नहीं बनाई जाती है। निर्यात कार्य दो तरीकों से होता है।

1) __declspec (dllexport के साथ एक समारोह का प्रतीक)।

या

2) एक .def फ़ाइल जो उन सभी कार्यों कि निर्यात किए जाने होते हैं, जिन्हें प्रयोग करें।

समाधान:

1) आम तौर पर एक संकलन समय ध्वज की आवश्यकता है __declspec करने के लिए कुछ #define स्थापित करने के लिए एक पूर्वप्रक्रमक ब्लॉक सक्रिय करने के लिए स्थापित किया जाना()। किसी और ने अपनी पोस्ट में सूचीबद्ध किया है।

2) लाइन गुणों को सेट करने की आवश्यकता है-> लिंकर-> इनपुट-> मॉड्यूल परिभाषा फ़ाइल।

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