2012-07-23 6 views
5

संभव डुप्लिकेट जोड़ें:
Windows & C++: extern & __declspec(dllimport)
Why/when is __declspec(dllimport) not needed?क्या __declspec करता है (dllexport) करते हैं, जब यह एक आयात समारोह से पहले

मुझे DLL परियोजना लिखना चाहते हैं। इस परियोजना में कई डीएलएल शामिल हैं। वे निर्भर हैं। मैं पालन जैसे कुछ मैक्रो निर्धारित:

#ifdef MYDLL_DECL1 
    #define DLL_DECL __declspec(dllexport) 
#else 
    #define DLL_DECL __declspec(dllimport) 
#endif 

मैं प्रत्येक मॉड्यूल के लिए परिभाषित MYDLL_DECL1 ... MYDLL_DECLn। क्योंकि मैंने सोचा कि क्या मैं एक ही मैक्रो को परिभाषित करता हूं कि यह काम नहीं करेगा। लेकिन मैं वास्तव में केवल एक मैक्रो को परिभाषित करना चाहता हूं, और मैंने एक टेस्टबेड लिखा था। मेरे पास दो मॉड्यूल हैं। दूसरे moudle की स्रोत फ़ाइल में। मैं पालन की तरह कोड लिखने:

#define MYDLL_DECL 
#include "moudle1.h" 
#include "moudle2.h" 

अगर मैं modle1 के सिर फ़ाइल के लिए एक ही मैक्रो का नाम "MYDLL_DECL", का उपयोग मैं "MYDLL_DECL" को परिभाषित किया है, इसलिए "DLL_DECL" '__declspec (dllexport)' के बराबर है। असल में मॉड्यूल 2 में यह "__declspec (dllimport)" के बराबर होना चाहिए, क्योंकि मॉड्यूल 2 आयात मॉड्यूल 1। लेकिन मैंने पाया कि यह काम करता है जब मैं दो मॉड्यूल के लिए एक ही मैक्रो को परिभाषित करता हूं। और मुझे यह भी पता चलता है कि ओपनसीवी इस मेथॉल्ड का उपयोग अपनी लाइब्रेरी

+2

... क्या ?? आप अपने खुद के मैक्रो को परिभाषित किए बिना सीधे '__declspec (dllimport)' का उपयोग कर सकते हैं! –

+4

http://stackoverflow.com/questions/4489441/why-when-is-declspec-dllimport-not-needed – Mohammad

+0

__declspec (dllimport) सी/सी ++ का एक विनिर्देशक है। तो मैं – Samuel

उत्तर

5

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

#ifdef MODULE1 
#define MODULE1_DECL __declspec(dllexport) 
#else 
#define MODULE1_DECL __declspec(dllimport) 
#endif 
:

जब से तुम दो अलग हेडर फाइल बनाए रखने के लिए नहीं करना चाहते हैं, और आप हर जगह नहीं क्या सशर्त संकलन करना , सबसे अच्छा समाधान एक सशर्त परिभाषित मैक्रो, जैसे का उपयोग करें

कंपाइलर का आविष्कार करते समय, आप प्रोजेक्ट मॉड्यूल 1 में केवल MODULE1 परिभाषित करते हैं; आप इसे किसी अन्य परियोजना में परिभाषित नहीं करते हैं। तो मॉड्यूल 1 संकलित करते समय, MODULE1_DECL__declspec(dllexport) तक फैलता है, और जब किसी भी अन्य मॉड्यूल को संकलित करता है, तो यह __declspec(dllimport) तक फैलता है।

+0

इसे मॉड्यूल 1 को परिभाषित करने की भी आवश्यकता है ... मॉड्यूलन। मैं केवल केवल एक मैक्रो को परिभाषित करना चाहता हूं। मैं सभी मॉड्यूल के लिए एक मैक्रो परिभाषित करता हूं। और यह काम करता है। क्योंकि मैंने पाया कि जब मैं अन्य डीएल आयात करना चाहता हूं। मुझे विनिर्देशक __declspec (dllimport) की आवश्यकता नहीं है। – Samuel

+0

हाय जेम्स कानज़, क्या आप इस प्रश्न को फिर से खोलने में मेरी मदद कर सकते हैं। मैंने अपना प्रश्न संशोधित कर दिया है। अब यह http://stackoverflow.com/questions/2288293/windows-c-extern-declspecdllimport और http://stackoverflow.com/questions/4489441/why-when-is-declspec-dllimport-not-needed जैसा नहीं है – Samuel

+0

@ सैमुएल मुझे नहीं पता कि यह मंच कैसे काम करता है, सिवाय इसके कि चीजें मनमाने ढंग से होती हैं, कुछ तर्कहीन कारणों से। मैं बस इतना कह सकता हूं कि यदि आप विनिर्देशक '__declspec (dllimport) 'का उपयोग नहीं करते हैं, और प्रतीकों को किसी अन्य अनुवाद इकाई से आयात किया जाता है, तो आपके पास अपरिभाषित व्यवहार होता है। यह कुछ प्रकार के प्रतीकों के लिए काम कर सकता है, लेकिन आप इस पर भरोसा नहीं कर सकते हैं। –

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