2011-01-10 20 views
5

मैं एक dll लिखने के लिए कोशिश कर रहा हूँ का उपयोग dllimport, यह कैसे मेरी हेडर फाइल दिखाई देता है:प्रक्रिया

#ifndef _DLL_H_ 
#define _DLL_H_ 

#if BUILDING_DLL 
# define DLLIMPORT __declspec (dllexport) 
#else /* Not BUILDING_DLL */ 
# define DLLIMPORT __declspec (dllimport) 
#endif /* Not BUILDING_DLL */ 


DLLIMPORT void HelloWorld (void); 


#endif /* _DLL_H_ */ 

.cpp फ़ाइल मैं इस हेडर फाइल शामिल हैं, और मैं एक dll आयात प्रक्रिया इस तरह से घोषित करने की कोशिश :

DLLIMPORT void HelloWorld() 
{ 
    MessageBox (0, "Hello World from DLL!n", "Hi", MB_ICONINFORMATION); 
} 

लेकिन संकलक (मैं खिड़कियों पर 7 64 बिट mingw32 है) मुझे इस त्रुटि दे रहता है:

E:\Cpp\Sys64\main.cpp|7|error: function 'void HelloWorld()' definition is marked dllimport| 
E:\Cpp\Sys64\main.cpp||In function 'void HelloWorld()':| 
E:\Cpp\Sys64\main.cpp|7|warning: 'void HelloWorld()' redeclared without dllimport attribute: previous dllimport ignored| 
||=== Build finished: 1 errors, 1 warnings ===| 

और मुझे समझ में नहीं आता क्यों।

+0

मैंने आपके दो खातों को विलय कर दिया ताकि आप अब एक उत्तर स्वीकार कर सकें। –

उत्तर

3

declspec(dllimport) मॉड्यूल की मॉड्यूल आयात तालिका में प्रविष्टियां उत्पन्न करता है। यह आयात तालिका लिंक समय पर प्रतीकों के संदर्भों को हल करने के लिए उपयोग की जाती है। लोड समय पर इन संदर्भों को लोडर द्वारा तय किया जाता है।

declspec(dllexport) डीएलएल की डीएलएल निर्यात तालिका में प्रविष्टियां उत्पन्न करता है। इसके अलावा आपको इसके साथ घोषित प्रतीकों (फ़ंक्शन, चर) को लागू करने की आवश्यकता है।

चूंकि आप डीएलएल लागू करते हैं, तो आपको BUILDING_DLL को परिभाषित करना होगा। यह #define के साथ किया जा सकता है लेकिन यह परियोजना सेटिंग्स में बेहतर सेट होना चाहिए।

+1

या कंपाइलर को '/ D BUILDING_DLL' पास करें (जो मुझे लगता है कि अधिक आम विकल्प है) – MSalters

+0

आप सही हैं। इसे उत्तर में जोड़ा गया। – harper

2

मुझे यह समझने से पहले एक ही त्रुटि थी कि मैंने वास्तव में BUILDING_DLL को परिभाषित नहीं किया था।

इसलिए, DLLIMPORT को __declspec (dllimport) के रूप में परिभाषित किया गया था और __declspec (dllexport) जैसा कि इसका इरादा था। प्रतीक को परिभाषित करने के बाद, समस्या हल हो गई थी।

-DBUILDING_DLL 

एक संकलक विकल्प के रूप में, या बस अपनी फ़ाइल के शीर्ष पर

#define BUILDING_DLL 

जोड़ें:

जब से तुम MinGW पर हैं, तो आपको निम्न पारित करने के लिए की जरूरत है। पूर्व बेहतर है, केवल # डिफाईन समाधान का उपयोग करें यदि आप यह समझ नहीं सकते कि gcc के -DBUILDING_DLL विकल्प को कैसे पास किया जाए।

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