DLL

2010-01-16 21 views
9

से सी ++ निर्यात वर्ग मैं चाहूँगा पता करने के लिए कर सकते हैं कि वर्ग (__declspec (वीसी में dllexport) ++) के निर्यात मानक (एएनएसआई, आईएसओ, ...)
मैं जानना चाहूंगा की तरह है अगर किसी को पहले से ही इंटेल सी ++ संकलक और जीसीसी (खिड़कियों पर MinGW) के साथ भी ऐसा ही करने की कोशिश की है और अगर यह अलग compilers से उत्पन्न DLLs मिश्रण के लिए संभव है (मैं वास्तव में संदेह है कि यह संभव है)DLL

Thx

+0

प्रश्न के पीछे विचार अलग-अलग प्रणालियों (जीत, लिनक्स, * बीएसडी) में कोड संकलित करने में सक्षम होना है, लेकिन विंडोज़ पर विकसित करना (मुझे दृश्य स्टूडियो और टूल्स जो यह प्रदान करता है (सभी के साथ आने वाले संस्करण में भी अधिक समांतर उपकरण उपलब्ध !!)) और यह mingw और msvc के साथ विंडोज़ पर त्वरित रूप से संकलित करने के लिए यह जांचने के लिए कि कोड "दिखता है" ठीक है। यह पोर्ट को लिनक्स को तेज़ और आसान बना देगा – user246456

उत्तर

9

नहीं, __declspec वीसी ++ विशिष्ट है।

वीसी ++ की आवश्यकता के कारणों में से एक कारण डिफ़ॉल्ट रूप से है, डीएलएल डीएलएल के बाहर प्रतीकों का पर्दाफाश नहीं करते हैं जब तक कि स्पष्ट रूप से ऐसा करने का अनुरोध न किया जाए। पॉज़िक्स पर, साझा ऑब्जेक्ट्स उनके सभी (स्थैतिक) प्रतीकों का पर्दाफाश नहीं करते हैं जब तक कि उन्हें स्पष्ट रूप से छिपाने के लिए कहा न जाए। ,

#ifdef WIN32 
    #ifdef EXPORT_CLASS_FOO 
    #define CLASS_FOO __declspec(dllexport) 
    #else 
    #define CLASS_FOO __declspec(dllimport) 
    #endif 
#else 
    #define CLASS_FOO 
#endif 

class CLASS_FOO foo 
{ ... }; 

परियोजना में वर्ग को लागू करने:

अद्यतन

अपनी टिप्पणी है कि आप अपने कोड पोर्टेबल बनाना चाहते आधार पर, आप पूर्वप्रक्रमक का उपयोग करें और इस तरह से कुछ करना चाहता हूँ एक प्रीप्रोसेसर परिभाषा के रूप में EXPORT_CLASS_FOO को जोड़ने के लिए सुनिश्चित करें (प्रोजेक्ट | NAME गुण .. सी/सी ++ के तहत .. प्रीप्रोसेसर | प्रीप्रोसेस परिभाषाएं)। इस तरह, आप डीएलएल बनाने के दौरान उन्हें निर्यात करेंगे, जब आप डीएलएल का उपयोग कर रहे हों तो उन्हें आयात करें और यूनिक्स के तहत कुछ खास नहीं करें।

+0

क्या इसका मतलब यह है कि हम एक वर्ग निर्यात कर सकते हैं और इसे तुरंत पुनः उपयोग कर सकते हैं? क्या यह सिस्टम विशिष्ट (पीओएसईक्स) या कंपाइलर है (लिनक्स पर इंटेल सी ++ एक ही व्यवहार प्रदान करता है) – user246456

+0

यह इंटेल सी ++ या जीसीसी पर कंपाइलर झंडे पर निर्भर करता है, लेकिन प्रतीकों को उजागर करने के लिए डिफ़ॉल्ट है। बस कुछ प्रीप्रोसेसर मैक्रोज़ बनाएं ताकि आप उस प्रकार के निर्यात को सशर्त रूप से संकलित कर सकें। –

+0

आर सैमुअल हम पॉज़िक्स साझा वस्तुओं में कक्षा को कैसे छुपाते हैं? –

2

सी ++ में __ के साथ शुरू होने वाली कोई भी चीज़ विक्रेता-विशिष्ट एक्सटेंशन है। मुझे नहीं पता कि कोई अन्य कंपाइलर विक्रेता इसका समर्थन करता है, लेकिन यह निश्चित रूप से संगत क्रॉस-कंपाइलर नहीं है।

+0

+1, हालांकि मुझे विश्वास है कि पोर्टिंग कोड को आसान बनाने के लिए मिनजीडब्ल्यू इस विशेष माइक्रोसॉफ्ट एक्सटेंशन का समर्थन करता है। वीसी ++ के विपरीत, मिनजीडब्ल्यू को इसकी आवश्यकता नहीं है। –

2

डीएलएल की धारणा बहुत ही प्लेटफार्म-विशिष्ट है। यह किसी भी दूरस्थ रूप से सार्वभौमिक रूप से लागू मानक द्वारा कवर नहीं किया गया है। यदि तथ्य है, तो डीएलएल का संक्षिप्त नाम आमतौर पर विंडोज गतिशील पुस्तकालयों के लिए आरक्षित होता है। जोड़ने की जरूरत नहीं है, सी/सी ++ में डीएलएल समर्थन के लिए विशिष्ट कुछ भी मंच/विक्रेता निर्भर है।

+1

असल में ओएस 2 ने डीएलएल का भी इस्तेमाल किया। लेकिन यह एक बार में एमएस और आईबीएम के बीच साझा कोड था ... :-) –

4

अब जीसीसी कंपाइलर/लिंकर स्टैक का उपयोग कर डीएलएल [विंडोज़] या एसओ [ऑन * निक्स] से केवल कुछ प्रतीकों [वर्ग/एपीआई] को निर्यात करना संभव है। इसे कैसे करें के बारे में काफी अच्छा अवलोकन के लिए, http://gcc.gnu.org/wiki/Visibility देखें।