2010-08-24 8 views
6

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

गतिशील लाइब्रेरी लोडिंग सिस्टम बनाने का सबसे आसान तरीका क्या है जिसे कोड के अतिरिक्त संशोधन के बिना संकलित और एकाधिक ऑपरेटिंग सिस्टम पर चलाया जा सकता है? आदर्श रूप में, मैं एक प्लगइन लिखना चाहता हूं, और यह परियोजना के सभी ऑपरेटिंग सिस्टम पर काम करता है।

धन्यवाद।

उत्तर

7

आपको लोडिंग सिस्टम के लिए प्लेटफॉर्म आश्रित कोड का उपयोग करना होगा। यूनिक्स में साझा ऑब्जेक्ट लोड करने से विंडोज़ पर डीएलएल अलग-अलग लोड हो रहा है। लेकिन, #ifdef के कुछ जोड़े के साथ आप लोडर में अधिकतर कोड बेस प्राप्त कर पाएंगे।

ऐसा कहकर, मुझे लगता है कि आप अपने प्लगइन्स प्लेटफ़ॉर्म को स्वतंत्र बना सकते हैं। बेशक, आपको इसे प्रत्येक प्लेटफ़ॉर्म के लिए संकलित करना होगा, लेकिन कोड 99% समान होगा।

5

विंडोज़ और यूनिक्स/लिनक्स को गतिशील लाइब्रेरी लोड करना 3 कार्यों के साथ काम करता है। लाइब्रेरी में किसी फ़ंक्शन का पता प्राप्त करने के लिए पुस्तकालयों को लोड/अनलोड करने के लिए फ़ंक्शंस की एक जोड़ी, और दूसरा फ़ंक्शन। क्रॉस ऑपरेटिंग सिस्टम suppport प्रदान करने के लिए आप आसानी से इन तीन कार्यों के आसपास एक रैपर लिख सकते हैं।

2

boost.extension लाइब्रेरी पर एक नज़र डालें, यह वास्तव में बढ़ावा का हिस्सा नहीं है, लेकिन आप इसे सैंडबॉक्स में पा सकते हैं। यह भी जमे हुए है, लेकिन समग्र पुस्तकालय स्थिर और उपयोग करने में आसान है।

4

आदर्श रूप में, मैं एक प्लगइन लिखना चाहता हूं, और यह परियोजना के सभी ऑपरेटिंग सिस्टम पर काम करता है। मेरे सिर के ऊपर से

कुछ बातें:

  • गतिशील पुस्तकालयों में स्थिर वस्तुओं से बचें। वस्तुओं को आवंटित करने के लिए उचित प्रारंभिक तरीकों/कार्यों को प्रावधान करें। ओएस द्वारा लोड की जाने वाली लाइब्रेरी के दौरान होने वाले मुद्दे (यह तब होता है जब स्थैतिक वस्तुओं के लिए ctors कहा जाता है) डीबग करना बहुत कठिन होता है - केवल बहु-थ्रेडिंग मुद्दों के लिए।

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

  • इंटरफेस हेडर में कार्यान्वयन कक्षाएं नहीं हो सकती हैं - केवल अमूर्त कक्षाएं और factory functions। पिछले बिंदु की तरह - आवेदन से बचने के लिए कक्षाओं के विशेष संस्करण पर निर्भर करता है। कंक्रीट कार्यान्वयन कक्षाओं को तुरंत चालू करने के लिए उपयोगकर्ता अनुप्रयोग के लिए कारखानों की आवश्यकता होती है।

  • चीजों को किसी भी तरह से पिछड़ा संगत रखने के लिए, इंटरफ़ेस के नए संस्करण को पेश करते समय, मौजूदा अमूर्त वर्ग को संशोधित न करें - इससे प्राप्त नया सार वर्ग बनाएं और वहां नई विधियां जोड़ें। नए संस्करण को वापस करने के लिए कारखाने बदलें। (एमएस 'IInterface, IInterface2, IInterface3 और इतने पर याद रखें।) कार्यान्वयन में, अमूर्त वर्ग के नए संस्करण का उपयोग करें। पॉलिमॉर्फिज्म द्वारा पुराने कार्यान्वयन संस्करणों के साथ पिछड़ा संगत कार्यान्वयन किया जाएगा।(यह स्पष्ट रूप से पुरानी इंटरफ़ेस रखरखाव और क्लीन-अप के लिए कॉल करता है - पुराने क्रुफ़्ट को हटाने के लिए।)

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

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