2009-08-07 13 views
14

कहें कि मेरे पास एक स्थिर सी ++ lib है, static.lib और मैं कुछ कार्यों को C++ साझा lib से कॉल करना चाहता हूं, shared.lib कहें। क्या यह संभव है?साझा लाइब्रेरी के लिए एक सी ++ स्टेटिक लाइब्रेरी लिंक कर सकते हैं?

अब मान लें कि मेरे पास एक और साझा lib है, share2.lib कहें जो static.lib से लिंक है लेकिन साझा.लिब से लिंक नहीं है। क्या लिंकर स्वचालित रूप से shared2.lib को इस मामले में shared.lib से लिंक करता है?

मैं माइक्रोसॉफ्ट विजुअल स्टूडियो 2003

उत्तर

22

स्टेटिक पुस्तकालय जुड़े नहीं हैं। वे केवल ऑब्जेक्ट फाइलों (* .obj या * .o) का एक संग्रह हैं जो एक लाइब्रेरी फ़ाइल (जैसे टैर/ज़िप फ़ाइल की तरह) में एकत्रित होते हैं ताकि लिंकर के लिए आवश्यक प्रतीकों को ढूंढना आसान हो सके।

एक स्थैतिक lib उन कार्यों को कॉल कर सकता है जिन्हें परिभाषित नहीं किया गया है (लेकिन केवल हेडर फ़ाइल में घोषित किया गया है), क्योंकि यह केवल संकलित है। फिर जब आप एक स्थिर या डीएल को जोड़ते हैं जो स्थैतिक lib का उपयोग करता है तो आपको दूसरी लाइब्रेरी से लिंक करना होगा जो स्थिर lib से कहा जाता है लेकिन इसमें परिभाषित नहीं किया जाता है।

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

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

आवेदन कोड के लिए मेरी वरीयता स्पष्ट भागों को स्पष्ट रूप से लिंक करना है।

6

लिंकर स्वचालित रूप से अन्य पुस्तकालयों में नहीं लाएगी उपयोग कर रहा हूँ, लेकिन आप #pragma comment (lib, "static.lib") उपयोग कर सकते हैं अपने हेडर फाइल को pragma जोड़कर अतिरिक्त फ़ाइलों को जोड़ने की प्रक्रिया को सरल।

0

मैं एक स्थिर सी ++ lib, static.lib है कहो और मैं एक सी ++ साझा lib से कुछ कार्यों कॉल करना चाहते हैं, कहते हैं कि shared.lib। क्या यह संभव है?

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

अब लगता है कि मैं किसी अन्य साझा lib है, shared2.lib जो static.lib से जोड़ता है लेकिन shared.lib से नहीं जुड़ते हैं का कहना है। क्या लिंकर स्वचालित रूप से shared2.lib को साझा किया गया है इस मामले में shared.lib?

इस तरह होने निर्भरता, बाद में समस्या पैदा कर रहा है कि आप के बजाय गतिशील LoadLibrary() का उपयोग कर लायब्रेरी लोड सुझाव है कि हो सकता है, इस तरह आप जबकि जोड़ने/संकलन इस तरह निर्भरता का ट्रैक रखने की जरूरत नहीं है।

+0

मैं मानता हूं कि आपको लाइब्रेरी निर्भरताओं से सावधान रहना चाहिए, लेकिन मुझे लगता है कि इस मामले में लोड लाइब्रेरी अधिक है।मुझे केवल प्लगइन प्रकार आर्किटेक्चर के लिए इसकी आवश्यकता है। – iain

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