2009-07-07 10 views
5

तो आम (कम से कम 2005 राज्यों) एक DLL के लिए निर्यात/आयात परिभाषित करने के लिए तरीका है:ही हैडर फ़ाइल

#ifdef MY_EXPORTS 
#define MY_API __declspec(dllexport) 
#else 
#define MY_API __declspec(dllimport) 
#endif 

class MY_API MyClass { 
    ... 
}; 

यह अच्छा काम करता है अगर मैं निर्माण कर रहा हूँ मेरी एक डीएलएल के रूप में कोड। हालांकि, मैं एक स्थिर पुस्तकालय या एक डीएलएल का उपयोग करने का विकल्प चाहते हैं। अब एक स्पष्ट (लेकिन भयानक) समाधान, डीएलएल 'MY_API' परिभाषित करने, सभी कोड की प्रतिलिपि बनाना है। अब एक बेहतर तरीका प्रतीत होता है कि कमांड लाइन स्विच या तो डीएलएल सामान को परिभाषित करने के लिए परिभाषित करता है या परिभाषित नहीं करता है। हालांकि एक स्थिर पुस्तकालय के मामले में 'MY_API' क्या होना चाहिए?

#ifdef DLL_CONFIG 
    #ifdef MY_EXPORTS 
    #define MY_API __declspec(dllexport) 
    #else 
    #define MY_API __declspec(dllimport) 
    #endif 
#else 
    #define MY_API // What goes here? 
#endif 

class MY_API MyClass { 
    ... 
}; 

अब यह सोचते हैं कि यह किया जा सकता है वहाँ मुद्दों होगा जब पुस्तकालय का एक उपयोगकर्ता हेडर फाइल भी शामिल है (यानी। वे 'DLL_CONFIG' को परिभाषित करना होगा)?

उत्तर

12

कुछ भी नहीं।

इसे #define MY_API के रूप में छोड़ दें और MY_API के सभी उदाहरण बस गायब हो जाएंगे।

आप नई बिल्ड कॉन्फ़िगरेशन, जैसे डीबग - डीएलएल और रिलीज - डीएलएल जोड़ सकते हैं जो #define DLL_CONFIG को छोड़कर दूसरों की नकल करते हैं।

कॉन्फ़िगरेशन क्लोन करने के लिए, कॉन्फ़िगरेशन प्रबंधक (जैसे डीबग/रिलीज़ सूची बॉक्स के ड्रॉप डाउन) पर जाएं, फिर 'सक्रिय समाधान कॉन्फ़िगरेशन' के तहत नया चुनें। अब आप इसे "डीबग - डीएलएल" नाम दे सकते हैं और Copy SettingsDebug पर सेट कर सकते हैं और अब यह करने के लिए छोड़ दिया गया है DLL_CONFIG परिभाषित करें।

ऐसा करने के लिए, प्रोजेक्ट गुणों पर जाएं-> कॉन्फ़िगरेशन गुण-> सी/सी ++ -> प्रीप्रोसेसर, और वहां DLL_CONFIG टाइप करें। आप यह भी देखेंगे कि NDEBUG और WIN32 जैसी चीजें परिभाषित की गई हैं।

haffax said की तरह, परियोजना विशिष्ट नामों का उपयोग करें। "- DLL" विन्यास है

#ifdef THEPROJECT_USE_DLL 
    #ifdef THEPROJECT_BUILDING_PROJECT 
     #define THEPROJECT_API __declspec(dllexport) 
    #else 
     #define THEPROJECT_API __declspec(dllimport) 
    #endif 
#else 
    #define THEPROJECT_API 
#endif 

अब आप अपने DLL के उपयोगकर्ताओं सिर्फ #define THEPROJECT_USE_DLL अगर वे DLL संस्करण उपयोग कर रहे हैं, बस आपके: मैं की तरह कुछ की सिफारिश करेंगे।

3

बस MY_API को खाली के रूप में परिभाषित करें। इस तरह:

#ifdef DLL_CONFIG 
    #ifdef MY_EXPORTS 
    #define MY_API __declspec(dllexport) 
    #else 
    #define MY_API __declspec(dllimport) 
    #endif 
#else 
    #define MY_API 
#endif 

स्थैतिक लिंकिंग के मामले में कोई declspec आवश्यक नहीं है।

आपकी लाइब्रेरी के उपयोगकर्ताओं को DLL_CONFIG को परिभाषित करना होगा यदि वे इसे डीएल के रूप में उपयोग करना चाहते हैं या इसे परिभाषित नहीं करते हैं, तो वे इसे स्थिर पुस्तकालय के रूप में उपयोग करना चाहते हैं। कोई समस्या नहीं होगी। इस तरह की विन्यास कई पुस्तकालयों में किया जाता है।

संपादित करें: बेशक आपको MY_EXPORTS और DLL_CONFIG नामों का उपयोग नहीं करना चाहिए। अपने सभी मैक्रोज़ के लिए प्रोजेक्ट विशिष्ट उपसर्ग का उपयोग करें, ताकि कोई नाम संघर्ष न हो।

1

कुछ भी नहीं करें। स्थिर पुस्तकालय के खिलाफ लिंक करने के लिए कोई विशेष कॉलिंग सम्मेलन की आवश्यकता नहीं है। केवल एक चीज जो आपको करने की ज़रूरत है, यह सुनिश्चित करना है कि लिंकर आपके .lib से लिंक हो।

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