2009-10-21 17 views
18

मैं विजुअल स्टूडियो 2005 का उपयोग कर ओपन-सोर्स सी ++ लाइब्रेरी बना रहा हूं। मैं स्रोत कोड के साथ प्रीबिल्ट libs प्रदान करना चाहता हूं। क्या ये libs, VS2005 के साथ निर्मित हैं, वे विजुअल स्टूडियो (एएसपी वीएस एक्सप्रेस संस्करण 2008) के नए संस्करणों के साथ भी काम करने जा रहे हैं? या मुझे प्रति वीएस संस्करण अलग-अलग libs प्रदान करने की आवश्यकता है?क्या सी ++ libs विजुअल स्टूडियो के विभिन्न संस्करणों के साथ एक-दूसरे के साथ संगत हैं?

+0

नहीं, मेरे व्यक्तिगत अनुभव में मैं 2008 में वीसी 6 द्वारा उत्पन्न लाइब्रेरी का उपयोग करने में सक्षम नहीं था। – Satbir

+2

क्या आपने स्थिर पुस्तकालयों के बजाय डीएलएल प्रदान करने पर विचार किया है? मान लीजिए कि आप "खतरनाक" संचालन नहीं कर रहे हैं (जैसे क्लाइंट कोड में आपकी लाइब्रेरी में संबंधित डीलोकेशन के साथ मेमोरी आवंटन) क्लाइंट बस आपके लाइब्रेरी को लोड कर सकता है चाहे आप इसे किस कंपाइलर के साथ बनाते हैं या आप किस पुस्तकालय से जुड़े हैं। –

+0

यह भी देखें: http: // stackoverflow।कॉम/प्रश्न/8439595/हैं-संकलित-lib-files-interchangeable-के-अलग-संस्करण-के-माइक्रोसॉफ्ट-विसु – DuckMaestro

उत्तर

14

यदि आप स्थैतिक पुस्तकालयों को वितरित कर रहे हैं, तो आप जो भी कर रहे हैं उसके आधार पर आप संस्करण-स्वतंत्र पुस्तकालयों को वितरित करने में सक्षम हो सकते हैं। यदि आप केवल ओएस को कॉल कर रहे हैं, तो आप ठीक हो सकते हैं। सी आरटीएल कार्यों, शायद। लेकिन यदि आप किसी भी सी ++ मानक लाइब्रेरी फ़ंक्शन, कक्षाएं या टेम्पलेट्स का उपयोग करते हैं, तो शायद नहीं।

यदि डीएलएल वितरित करते हैं, तो आपको प्रत्येक वीएस संस्करण के लिए अलग-अलग पुस्तकालयों की आवश्यकता होगी। कभी-कभी आपको विभिन्न सेवा-पैक स्तरों के लिए अलग-अलग पुस्तकालयों की भी आवश्यकता होती है। और जैसा कि वोल्करके द्वारा उल्लेख किया गया है, आपकी लाइब्रेरी के उपयोगकर्ताओं को संगत कंपाइलर और लिंकर सेटिंग्स का उपयोग करना होगा। और यहां तक ​​कि यदि आप सबकुछ सही करते हैं, तो उपयोगकर्ताओं को अन्य पुस्तकालयों से लिंक करने की आवश्यकता हो सकती है जो किसी भी तरह से आपके साथ असंगत हैं।

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

+2

और यहां तक ​​कि परियोजना सेटिंग्स/कंपाइलर झंडे भी एक ही संकलक संस्करण के भीतर बाइनरी असंगत कोड का कारण बन सकते हैं, उदा।/जेडसी: wchar_t (जो डिफ़ॉल्ट रूप से चालू है VS2005 में एक तोड़ने वाला परिवर्तन था) – VolkerK

17

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

इस पर, विभिन्न कंपाइलर संस्करण अलग संकलित कोड को मंथन करते हैं और एक कंपाइलर संस्करण से कोड अक्सर सबसे छोटे मामलों में से दूसरे के साथ संगत नहीं होता है (और यदि वे एक ही कोड को मंथन करते हैं तो वहां अलग-अलग संस्करण होने का कोई मतलब नहीं है :))

+0

> यदि आप कोई प्रोग्राम चलाने का प्रयास करते हैं जिसके लिए इस रनटाइम के दो अलग-अलग संस्करणों की आवश्यकता होती है तो त्रुटियां होती हैं। यह हमारे लिए काम करता है, हमारे बाहरी पुस्तकालयों में से एक पुराने एमएसवीसीआरटी *। डीएल – KindDragon

6

आम तौर पर विभिन्न कंपाइलर्स, एक ही कंपाइलर के विभिन्न संस्करणों और उसी कंपाइलर संस्करण की विभिन्न सेटिंग्स के साथ बनाए गए पुस्तकालयों के खिलाफ लिंक करना संभव नहीं है और एक कार्यरत एप्लिकेशन प्राप्त करना संभव नहीं है। (हालांकि यह भाषा और एसडीडी लाइब्रेरी के विशिष्ट सबसेट्स के लिए काम कर सकता है।) सी ++ के लिए कोई मानक बाइनरी इंटरफ़ेस नहीं है - सी में कुछ सामान्य प्लेटफ़ॉर्म के लिए भी नहीं है क्योंकि सी

प्राप्त करने के लिए, आपको या तो अपनी लाइब्रेरी को सी एपीआई में लपेटें या आपको प्रत्येक कंपाइलर, कंपाइलर संस्करण और कंपाइलर सेटिंग के लिए बाइनरी भेजनी होगी जिसे आप समर्थन देना चाहते हैं।

+2

का उपयोग करता है जीसीसी एक मानक एबीआई परिभाषित करता है कि जीसीसी उपयोग के सभी संस्करण। इंटेल का कंपाइलर उसी एबीआई का उपयोग करता है, इसलिए इंटेल द्वारा संकलित पुस्तकालयों का उपयोग जीसीसी द्वारा किया जा सकता है। हालांकि, एमएसवीसीआरटी और ग्लिबैक लाइब्रेरी और एप्लिकेशन के अनुसार वर्कमाड 3 द्वारा उल्लिखित आवेदन के समान होना चाहिए। –

+1

@ कैस्पिन: हां, लेकिन यह तब भी विफल हो जाता है जब उस एबीआई के दोनों पक्ष std lib और अन्य सभी लाइब्रेरी के समान संस्करण का उपयोग नहीं करते हैं जिनके प्रकार वे सीमा पार करना चाहते हैं। यह त्रुटियों को डीबग करने के लिए बहुत मुश्किलों के लिए एक टिकट है जो केवल कुछ दुर्लभ परिस्थितियों में दिखाया जा सकता है। BTDT। – sbi

2

यदि आपकी लाइब्रेरी प्रोजेक्ट एक स्थिर लाइब्रेरी है, तो आपको अपने विज़ुअल स्टूडियो संस्करण के लिए एक बिल्ड की आपूर्ति करना होगा, जिसे आप अपने उपयोगकर्ताओं में रखना चाहते हैं। उदाहरण में आपने दिया है, जो एक वीएस2005 दोनों प्रदान करने के बराबर है और एक वीएस -2008 पुस्तकालय।

यदि आपकी लाइब्रेरी प्रोजेक्ट गतिशील लाइब्रेरी है, तो, आप कुछ हद तक समस्याओं से बचते हैं, लेकिन इसका मतलब है कि उपयोगकर्ताओं को यह सुनिश्चित करना होगा कि वे 'माइक्रोसॉफ्ट सी रनटाइम' का उपयोग करें जो आपके निर्माण वातावरण के अनुकूल है। आप उस मानदंड को खत्म कर सकते हैं जब आप अपनी गतिशील लाइब्रेरी में 'माइक्रोसॉफ्ट सी रनटाइम' को स्थिर रूप से लिंक करते हैं।

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

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