2009-06-09 6 views
8

में प्रोग्राम लाइब्रेरी बनाना मैं अपने सी ++ प्रोग्राम में पुस्तकालयों का उपयोग करने की योजना बना रहा हूं। लिनक्स पर विकास हो रहा है लेकिन एप्लिकेशन को लिनक्स और विंडोज दोनों पर संकलित करने के लिए डिज़ाइन किया गया है। मैं विंडोज़ में साझा पुस्तकालयों (.so) के लिए प्रत्यक्ष समकक्ष समझता हूं डीएलएल है, है ना?विंडोज और लिनक्स [सी ++]

जी ++ का उपयोग कर लिनक्स में, मैं -fPIC और -shared झंडे का उपयोग करके साझा लाइब्रेरी बना सकता हूं। AFAIK, साझा लाइब्रेरी के लिए कोई अन्य कोड परिवर्तन आवश्यक नहीं है। लेकिन विंडोज़ डीएलएल में चीजें अलग हैं। वहां मुझे उन कार्यों को निर्दिष्ट करना होगा जिन्हें dllexport का उपयोग करके निर्यात किया जाना चाहिए, है ना?

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

संकलनकर्ता

  • इस्तेमाल किया जी ++ - लिनक्स
  • कुलपति ++ - विंडोज

किसी भी मदद की बहुत अच्छा होगा!

उत्तर

9

हम कक्षा के लिए __declspec(dllexport) निर्दिष्ट करें:

#define EXPORT_XX __declspec(dllexport) 

class EXPORT_XX A 
{ 
}; 

फिर आप मंच के लिए जाँच कर सकते हैं और केवल खिड़कियों पर मैक्रो निर्धारित। उदा .:

#ifdef WIN32 
#define EXPORT_XX __declspec(dllexport) 
#else 
#define EXPORT_XX 
#endif 

हम ज्यादातर स्थिर पुस्तकालयों का निर्माण तो वहाँ गतिशील libs के लिए क्या करने के लिए और अधिक सामान हो सकता है लेकिन अवधारणा ही है - स्ट्रिंग है कि आप Windows कोड में डालने के लिए की जरूरत है परिभाषित करने के लिए उपयोग पूर्वप्रक्रमक मैक्रो।

+0

धन्यवाद। खिड़कियों में बनाए गए डीएलएल का प्रकार क्या होगा? क्या वह एक COM डीएल होगा? क्या डीएलएल नरक के मुद्दों में भाग लेने की संभावना है? –

+0

dllexport का उपयोग करने से डीएल को COM सिस्टम में उजागर नहीं किया जाता है। डीएल नरक की संभावना इस बात पर निर्भर करती है कि आप डीएलएल और एप्लिकेशन को कैसे वितरित करते हैं। यदि आप हमेशा अपने ऐप की आवश्यकता वाले डीएलएस को स्थापित करते हैं, तो समस्या यह डीएलएल से संबंधित है, यह कोई मुद्दा नहीं है। –

+0

@sean ई: धन्यवाद। मैं हमेशा डीएलएल के ऐप को एप्लिकेशन निर्देशिका में स्थापित करने की आवश्यकता रखूंगा। कभी-कभी छोटे अपडेट हो सकते हैं जो पूरे एप्लिकेशन की बजाय एक डीएलएल को प्रतिस्थापित करेंगे। क्या यह एक समस्या हो सकती है? –

2

आप सशर्त संकलन के लिए #ifdef प्रीप्रोसेसर निर्देश का उपयोग कर सकते हैं। उदाहरण के लिए:

#ifdef WIN32 
    // Win32 specific code 
#else 
    // Elsewhere 
#endif 
5

एक और विकल्प सिर्फ अपने विंडोज़ प्रोजेक्ट के लिए .def फ़ाइल का उपयोग करना है। यह फ़ाइल डीएलएल निर्यात को निर्दिष्ट करती है, इसलिए आपको अपना कोड बेस गड़बड़ नहीं करना पड़ेगा। (लेकिन यदि आप अतिरिक्त फ़ाइल से बचना चाहते हैं तो मैक्रोज़ निश्चित रूप से जाने का तरीका हैं।)

+0

.def फ़ाइलों में सी ++ प्रतीकों का उपयोग करके बहुत गन्दा हो सकता है। –

+0

वह क्या कर रहा है, इस पर निर्भर करता है, यदि पुस्तकालयों से उसका मतलब है कि किसी प्रकार का प्लगइन आर्किटेक्चर है, तो वह सी इंटरफ़ेस के साथ बेहतर है और .def फ़ाइलें काम करेगी। – diapir

1

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

+1

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