8

मेरे पास विजुअल स्टूडियो 2010 में एक अप्रबंधित सी ++ प्रोजेक्ट है। यह एक विक्रेता से बूस्ट, ग्लूट और दूसरी लाइब्रेरी का उपयोग करता है।विजुअल स्टूडियो 2010 में गतिशील और स्थैतिक लिंकिंग और तैनाती

मैंने एक और "डीएल-इंडिपेंडेंट" निष्पादन योग्य संभव बनाने के लिए प्रोजेक्ट स्थापित किया है। सभी बूस्ट लाइब्रेरी स्थिर रूप से जुड़े हुए हैं और निर्देशिका में डीएल की कोई आवश्यकता नहीं है जहां निष्पादन योग्य रहता है।

ग्लूट के लिए वही बात, मैंने glut32.dll के बजाय स्थिर glut32.lib को जोड़ा है और फिर कोई समस्या नहीं है।

मैंने रनटाइम पुस्तकालयों के लिए गैर-डीएलएल संस्करण, यानी मल्टीथ्रेडेड डीबग (डीबग कॉन्फ़िगरेशन के लिए) और रिलीज कॉन्फ़िगरेशन के लिए मल्टीथ्रेडेड के लिए चुना है।

अब, विक्रेता जो मैं पहले बोल रहा था, दो विकल्प प्रदान करता है एक विक्रेता.लिब और एक Vendor.dll।

वेंडर.लिब लिंकर-> अतिरिक्त निर्भरताओं में जोड़ा गया है लेकिन रनटाइम पर मुझे हमेशा निष्पादन योग्य की एक ही निर्देशिका में Vendor.dll डालना होगा, अन्यथा रनटाइम पर्यावरण शिकायत करता है क्योंकि यह विक्रेता नहीं मिलता है । डीएल पुस्तकालय।

मुझे इस समस्या को कैसे हल करना चाहिए? मैं प्रत्येक निर्देशिका में .dll फ़ाइल डालने से बचना चाहता हूं।

मैं डीएल को एक्सई की एक ही निर्देशिका में नहीं रखना चाहता हूं और सामान्य रूप से विजुअल स्टूडियो में अप्रबंधित सी ++ कंसोल अनुप्रयोगों को तैनात करने के लिए दिशानिर्देश क्या हैं?

मुझे पता है कि इस तर्क के बारे में कई प्रश्न और पृष्ठ हैं लेकिन इनमें से कोई भी मुझे इस बिंदु को स्पष्ट नहीं करता है।

कुछ विचार?

उत्तर

10

माइक्रोसॉफ्ट रास्ते में थोड़ा अजीब यह इस संभालती है: जब आप एक .dll बनाते हैं, आप भी एक उदारीकरण, जो .dll में सार्वजनिक प्रतीक शामिल होते हैं पैदा करते हैं। रनटाइम पर .dll लोड करने के लिए आपको .lib के विरुद्ध लिंक करना होगा, लेकिन यह .lib अभी भी एक स्थिर लाइब्रेरी नहीं है। यदि आपका विक्रेता स्थैतिक लिंकिंग के लिए एक संस्करण प्रदान करता है, तो कोई भी .dll, या दो .lib (संभवतः अलग-अलग निर्देशिकाओं में या अलग-अलग नामों के साथ) होगा। माइक्रोसॉफ्ट का एक और उदाहरण गंभीर विकास से अधिक आवश्यक से कठिन है।

+2

यह एमएस विशिष्ट नहीं है। लिनक्स में भी आयात पुस्तकालय हैं। – rubenvb

+8

यूनिक्स में दो प्रकार के "पुस्तकालय" हैं: पुस्तकालय (.a फ़ाइलें) और साझा ऑब्जेक्ट्स (.so फ़ाइलें)।एक पुस्तकालय प्रदान करने वाला विक्रेता (सामान्य अर्थ में) आमतौर पर दोनों प्रदान करेगा। यदि आप .a फ़ाइल के विरुद्ध लिंक करते हैं, तो आप स्थिर रूप से लिंक करते हैं, और यदि आप .so के विरुद्ध लिंक करते हैं, तो आप गतिशील रूप से लिंक करते हैं। माइक्रोसॉफ्ट समाधान के साथ समस्या यह है कि 1) आपके पास गतिशील लिंकिंग के लिए दो अलग-अलग फ़ाइलें हैं, और 2) फ़ाइलों में से एक का एक स्थिर पुस्तकालय जैसा ही नाम है। –

+0

आपके उत्तर के लिए धन्यवाद। शायद मैं इस विषय पर उलझन में अकेला नहीं हूं। इसलिए, जैसा कि आप कह रहे हैं, दो प्रकार की .lib फ़ाइलें हैं, एक जब एक गतिशील पुस्तकालय की आवश्यकता होती है और दूसरा जो स्थिर पुस्तकालय हो सकता है। मुझे एक और विक्रेता.लिब फ़ाइल नहीं मिल रही है, इसलिए मुझे लगता है कि मैं पहले मामले में हूं ... धन्यवाद! – linello

7

विक्रेता.लिब को स्थैतिक रूप से संकलित लाइब्रेरी होने की आवश्यकता है। यदि आप इसे लिंक करते हैं तो आपको अभी भी Vendor.dll की आवश्यकता है, ऐसा लगता है जैसे Vendor.lib वास्तव में एक स्थिर लाइब्रेरी की बजाय एक आयात लाइब्रेरी है।

यह देखने के लिए जांचें कि क्या विक्रेता एक और विक्रेता प्रदान करता है। लिब (जो आपके वर्तमान .lib से थोड़ा बड़ा होना चाहिए) जो स्थिर पुस्तकालय है और उससे जुड़ने का प्रयास करें। यदि ऐसा है, तो आपको डीएलएल की आवश्यकता नहीं होगी।

+0

दुर्भाग्य से मेरे पास उस लाइब्रेरी में अन्य .lib फ़ाइलें नहीं हैं, इसलिए मुझे लगता है कि मैं गतिशील लिंक केस में हूं। निष्पादन योग्य निर्देशिका में प्रतिलिपि बनाने के बजाय .dll को शामिल करने के लिए कोई अन्य तरीका नहीं है (या उन्हें सिस्टम 32 फ़ोल्डर में कॉपी करना?) – linello

+0

यदि आपके पास विक्रेता स्रोत तक पहुंच है, तो आप विक्रेता को एक स्थिर पुस्तकालय के रूप में संकलित कर सकते हैं । अन्यथा, यदि आपको साझा lib का उपयोग करना है, तो आपके exe को रनटाइम पर इसका उपयोग करने की आवश्यकता है, जिसका अर्थ यह है कि इसे exe के साथ फ़ोल्डर में जोड़ना, या उसे उस फ़ोल्डर में डालना जो% PATH% में शामिल है (सम्मेलन सिस्टम 32 फ़ोल्डर)। – Fraser

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