2011-01-16 22 views
7

अपने आवेदन में मैं 3 प्रमुख भाग होते हैं:लिंकिंग: स्थैतिक बनाम गतिशील

  • Exe: एक निष्पादन योग्य फ़ाइल
  • Lib_A: एक पुस्तकालय में शामिल है एक सिंगलटन वर्ग और एक आधार वर्ग कुछ गणना में इस्तेमाल किया जा करने के लिए सिंगलटन वर्ग
  • Lib_B: एक पुस्तकालय Lib_A

कारण मैं व्युत्पन्न वर्ग है Lib_B है में में आधार से व्युत्पन्न वर्ग के एक नंबर होता है, मैं चाहूँगा Exe से रनटाइम पर Lib_B संकलित करने के लिए। मुझे पूरे सिस्टम को समाप्त किए बिना गणना के दौरान व्युत्पन्न कक्षाएं उत्पन्न करने की आवश्यकता है। यह मेरे लिए बहुत महत्वपूर्ण है। इसका मतलब है कि शुरुआत में मैंने लिबबी 1 गतिशील रूप से लोड किया होगा, मैं भी Lib_B के अन्य संस्करणों को Lib_B2, Lib_B3, Lib_B4 आदि के रूप में संकलित कर सकता हूं और उन्हें गतिशील रूप से भी लोड कर सकता हूं। सभी Lib_Bx पुस्तकालयों में कक्षाओं को निर्यात करने के लिए प्रवेश बिंदु कार्य होंगे।

तो खाते में निम्न तथ्यों लेने:

  • रनटाइम पर साझा करने के लिए एक ही Lib_A फ़ाइलों के विभिन्न संख्या में हो जाएगा।
  • एप्लिकेशन को विंडोज और लिनक्स में चलाना चाहिए। तो आंशिक क्रॉस-प्लेटफार्म एक मुद्दा है।
  • मैं tbb.dll आदि जैसे अपने स्वयं के पुस्तकालयों हो सकता है जो TBB, बूस्ट, क्यूटी जैसे कुछ पुस्तकालयों का उपयोग करने जा रहा हूँ

क्या पेशेवरों और स्थिर या गतिशील दोनों Exe के खिलाफ Lib_A को जोड़ने की विपक्ष हैं और Lib_Bx है? परफॉर्मेंस, सिस्टम का आकार इत्यादि कैसे प्रभावित हो सकता है? क्या कोई ओएसई, लिब_ए और लिबब्क्स के लिए एक ही कंपाइलर का उपयोग करने के लिए प्रत्येक ओएस के अलावा मैं किसी भी खतरनाक या कठिन परिस्थितियों को घेर सकता हूं।

पूरे सिस्टम का डिज़ाइन मेरे लिए एक बहुत कठिन समस्या है, इसलिए किसी भी टिप्पणी की सराहना की जाएगी।

बहुत बहुत धन्यवाद।

उत्तर

6

जो मैं आपके प्रोजेक्ट विवरण के बारे में समझता हूं, उससे आपको लिब_ए गतिशील रूप से लिंक करना चाहिए: यदि आप अपने प्रत्येक Lib_Bx साझा पुस्तकालयों में लिब_ए को स्थिर रूप से लिंक करते हैं, तो आप लिब_ए कोड और स्थैतिक चर के x गुना डुप्लिकेट करेंगे।

कहो, आप Lib_A में एक वर्ग है, प्रपत्र है कि अगर:

class BaseKlass 
{ 
    static int instance_count; 
    ... 
}; 

instance_count अपने सभी साझा पुस्तकालयों में दोहराया जाएगा, इस प्रकार यह BaseKlass के लिए असंभव इसके उदाहरणों गिनती करने के लिए बनाते हैं।

आप संभवतः आदि आभासी तालिकाओं के साथ और अधिक सूक्ष्म समस्याओं, या RTTI (dynamic_cast),

ने काट लिया जा सकता है आप इस boost.python document कि मैं क्या mentionned से संबंधित समस्याओं का वर्णन करता है पर एक नजर है चाहिए।

Boost.python उसी प्रक्रिया में लोड होने वाले पाइथन मॉड्यूल (गतिशील पुस्तकालय) बनाने की अनुमति देता है। Boostththth के साथ बनाया गया प्रत्येक पायथन मॉड्यूल, यदि वे किसी अन्य मॉड्यूल में कक्षा ए से मॉड्यूल में कक्षा बी प्राप्त करने जैसे सी ++ स्तर पर एक साथ संवाद करना चाहते हैं, तो समस्याओं से बचने के लिए boost.python lib के साथ गतिशील रूप से लिंक करना होगा।

3

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

गतिशील लिंकिंग के कुछ बड़े फायदे हैं। प्रत्येक बार जब आप कोई परिवर्तन करते हैं, तो केवल संशोधित डीएलएल को पूरे एप्लिकेशन को पुन: संकलित करने की आवश्यकता नहीं होती है। जब तक वे एबीआई संगत होते हैं, तब तक आप शेष एप्लिकेशन से अलग-अलग अद्यतन डीएल को वितरित कर सकते हैं।

विंडोज और लिनक्स पर एक ही कंपाइलर का उपयोग करना आसान हो सकता है, लेकिन आपको निश्चित रूप से एक ही कंपाइलर का उपयोग करने की आवश्यकता नहीं है।

जब तक आप पोर्टेबल पुस्तकालयों तक चिपके रहते हैं, तब तक विंडोज और लिनक्स के बीच सबसे बड़ा अंतर आमतौर पर बिल्ड सिस्टम होता है। कुछ डेवलपर्स पूरी तरह अलग बिल्ड सिस्टम बनाए रखते हैं, लेकिन सीएमके जैसे क्रॉस प्लेटफॉर्म बिल्ड सिस्टम के बहुत सारे हैं।

+0

वैसे मैं विंडोज़ में एमएसवीसी ++ कंपाइलर और लिनक्स में इंटेल सी ++ कंपाइलर का उपयोग करना चाहता हूं। मुझे लगता है कि दोनों जीसीसी की तुलना में बेहतर अनुकूलित कोड उत्पन्न करते हैं। आवेदन सिर्फ मेरे उपयोग के लिए है। मैं इसे बेचने को तैयार नहीं हूं। –

+0

@sad_man: और आप वीसी और आईसीसी के लिए पुनर्वितरण अधिकार प्राप्त करने की योजना बना रहे हैं? उसके साथ अच्छा भाग्य। – ephemient

+0

@ephermient: मैं अब के लिए अपने आवेदन को विचलित नहीं करता हूं। लेकिन अगर मैं इसे भविष्य में बेचता हूं, तो जाहिर है कि ग्राहक अपनी खुद की प्रतिलिपि की प्रतिलिपि प्रदान करेगा। मुझे पता है कि यह अच्छा नहीं लगता है लेकिन संकलित बाइनरी कोड की गति प्राप्त करने के लिए यह एक चाल है। अभी के लिए मैं वीसी और आईसीसी के साथ ठीक हूँ। सबसे खराब मामले में मैं आवेदन जीसीसी के साथ सही वितरित कर सकता हूं? :) –

2

क्या आप नए कक्षा रनटाइम बनाना चाहते हैं? सी ++ इस तरह काम करने के लिए नहीं है। सी ++ कक्षा स्थिर हैं और सभी संकलन समय मौजूद होना चाहिए। साझा, गतिशील रूप से लोड करने योग्य पुस्तकालय इस मुद्दे को हल करने के लिए नहीं हैं।

सरल समाधान उस भाषा के एक दुभाषिया को एम्बेड करना हो सकता है जिसमें गतिशील प्रकार हैं (उदाहरण के लिए लुआ जैसे) और इसमें रन-टाइम डायनामिक ऑब्जेक्ट्स लिखें।

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

+0

लेकिन फिर मुझे सी ++ की गति और लचीलापन का लाभ नहीं हो सकता है। –

+0

किसी भी आवेदन की गति मुख्य रूप से डेवलपर्स के उच्च कौशल से आता है।उपयोगकर्ता इनपुट रन-टाइम से उत्पन्न कोड कुशल होने के लिए नहीं उम्मीद की जानी चाहिए, लेकिन जहां दक्षता प्रोटोटाइप के लिए तरह की जरूरत नहीं है उपयोगी हो सकता है। इसलिए मैंने कुछ स्क्रिप्ट दुभाषिया का उपयोग करने का सुझाव दिया। –

+0

उपयोगकर्ता इनपुट रन-टाइम से उत्पन्न यस कोड को कुशल होने की उम्मीद नहीं की जानी चाहिए लेकिन उपयोगकर्ता इनपुट रन-टाइम से संकलित बाइनरी कोड एक स्क्रिप्ट दुभाषिया से कोड बहुत तेज़ होना चाहिए। –

0

सिद्धांत रूप में यह सब संभव है यदि सभी तीन डीएलएल हैं - आप अपने ऐप से कंपाइलर को ट्रिगर कर सकते हैं और फिर गतिशील रूप से नए डीएलएल लोड कर सकते हैं। यह वास्तव में किसी अन्य प्लगइन आर्किटेक्चर की तरह है (Lib_Bx DLL को प्लगइन होने पर विचार करें)।

मैं सवाल करता हूं कि यह एक बुद्धिमान दृष्टिकोण है या नहीं। क्या आपको अपने समाधान के लिए सी ++ कंपाइलर की पूर्ण लचीलापन की आवश्यकता है? क्या आपने समस्या को हल करने के विभिन्न तरीकों का प्रोफाइल किया है? यदि आप संख्यात्मक प्रसंस्करण कर रहे हैं तो ओपनसीएल की तरह कुछ बेहतर दृष्टिकोण होगा?

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