2012-01-16 12 views
5

मेरी कंपनी में, हमने हाल ही में वीसी 9 से वीसी 10 तक स्विच किया है।रनटाइम एक व्यवहार्य समाधान मिश्रण है?

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

ये डीएलएल कस्टम संरचनाओं का उपयोग करते हैं, जिनमें से कुछ std::vector, std::map और इसी तरह के होते हैं। अब, यह मेरे ध्यान में आया है कि मानक कंटेनरों का आकार बदल गया: कुछ बड़े हो गए, कुछ छोटे हो गए। नतीजतन, हमारे कस्टम संरचनाओं का आकार भी बदल गया।

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

व्यक्तिगत रूप से, मुझे लगता है कि यह "समाधान" भयानक है क्योंकि आकार महत्वपूर्ण है, तो संरचनाओं का लेआउट भी करता है। मेरे लिए, संगठनात्मक मुद्दों को ठीक करने के लिए सभी संरचनाओं की स्मृति पदचिह्न में वृद्धि वास्तव में गलत लगता है।

इसे छोटा करने के लिए, मेरा प्रश्न है: क्या फ़ंक्शन प्रोटोटाइप में गैर-सी प्रकारों का उपयोग करते समय एक साथ दो अलग-अलग रनटाइम्स (वर्णित चाल या किसी अन्य चाल का उपयोग करना) का उपयोग करना संभव है? क्या आपके पास इसी तरह की स्थिति के बारे में कोई अच्छा/बुरा अनुभव है?

उत्तर

9

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

आप DLL का निर्माण करने के लिए है कि सुरक्षित रूप से अलग संकलक संस्करणों के साथ इस्तेमाल किया जा सकता चाहते हैं, आप, कुछ विकल्प हैं जैसे:

  1. एक शुद्ध सी इंटरफेस (DLL सी में लिखा जा सकता है ++ का पर्दाफाश, लेकिन इंटरफेस शुद्ध सी होना चाहिए, और सी ++ अपवाद डीएलएल सीमाओं को पार नहीं कर सकते हैं)।
  2. डीएलएल इंटरफ़ेस पर अमूर्त इंटरफेस का खुलासा करें, जैसा कि article में बताया गया है।
  3. COM का उपयोग करें।
+0

'1.' एक विकल्प नहीं है, लेकिन' 2.' वास्तव में अच्छी तरह से काम कर सकता है। लिंक किए गए आलेख के लिए बहुत बहुत धन्यवाद। – ereOn

+0

@ereOn: आपका स्वागत है। –

1

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

मुझे आपके प्रश्न से छाप मिलती है कि आप कुछ पुस्तकालयों के खिलाफ जुड़ेंगे जो बदले में संकलित और वीसी 9 रनटाइम के खिलाफ जुड़े हुए हैं, इस मामले में वीसी 10 के साथ शेष कोड को लिंक करना संभव हो सकता है, जब तक पुस्तकालय अपने इंटरफेस में किसी भी वीसी 9 लाइब्रेरी प्रकार का पर्दाफाश नहीं करते हैं। मैं कहता हूं 'ठीक हो सकता है', यह एक क्षेत्र है जो संकट और जाल से भरा हुआ है और आम तौर पर मैं कहूंगा कि जब भी संभव हो, आपको उसी रनटाइम का उपयोग करना चाहिए। आखिरी चीज जो आपको चाहिए वह है कि कंपाइलर भ्रमित हो रहा है कि आप किस std :: वेक्टर के बारे में बात कर रहे हैं (और आप गारंटी दे सकते हैं कि प्रोग्रामर भी भ्रमित हो जाएंगे, भले ही आप कंपाइलर और लिंकर को इसे समझने के लिए राजी कर सकें) ।

यह नास्टियर है, लेकिन यह तब तक आसान है जब तक कि पुराने रनटाइम तक टिके रहें, जब तक कि किसी भी लक्ष्य मशीन पर इसकी आवश्यकता न हो।

+0

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

+0

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

+1

'एंटरप्राइज़' द्वारा आपका मतलब 'पुराना और मुश्किल से कार्यात्मक' है, है ना? वीएसएस वास्तव में भयानक है, मैं सहानुभूति देता हूं। ऐसा लगता है जैसे आप एक अप्रिय स्थिति में हैं। –

1

मैंने वास्तव में पहले ऐसा किया है, पैडिंग संरचनाओं को इसी तरह से बाहर निकाला है। हां, आप दो अलग-अलग रनटाइम का उपयोग कर सकते हैं और इसे तब तक ठीक से काम करना चाहिए जब तक कि एबीआई समान न हो: यहां वह जगह है जहां आप दीवारों को हिट करेंगे, जब संरचनाएं आकार बदलने लगती हैं, और सी ++ (जहां एबीआई पूरी जगह पर है) डीएलएल सीमाएं वास्तव में, वास्तव में गन्दा है। खासकर यह देखते हुए कि वीसी 10 में सी ++ 11 की प्रत्याशा में काफी बदलाव हुए हैं। मैं सी का उपयोग करता हूं जहां डीएलएल का संबंध है, पूरी तरह से गारंटी के लिए यह मुझे बाइनरी संगतता के संदर्भ में देता है।

मेरे लिए एक विशिष्ट मामला पेश करना मुश्किल है जहां चीजें वास्तव में इसे खाएंगी, लेकिन मुझे इसे आपको इस तरह से रखने दें: यह उन बग्स हैं जिन्हें आप उम्मीद नहीं करते हैं जो आपको प्राप्त करेंगे, और यह एक वास्तविक हॉर्नेट घोंसला है ।

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