2012-03-17 15 views
12

निर्यात करने के लिए डीएलएल का उपयोग करते समय मैं एक डीएल निर्यात वर्ग के आधार पर व्युत्पन्न कक्षा को परिभाषित करना चाहता हूं। आधार वर्ग प्रोजेक्ट ए में परिभाषित किया गया है, और व्युत्पन्न वर्ग__declspec (dllimport) के लिए अनसुलझा बाहरी प्रतीक वर्ग

सबसे पहले परियोजना बी में है, प्रोजेक्ट ए में, पूर्वप्रक्रमक MYDLL_BUILD परिभाषित किया गया है। और मैं निर्यात/आयात निर्दिष्ट करने के लिए एक हेडर फाइल का उपयोग करें:

class MYDLL_API DllObject 
{ 
public: 
    virtual ~DllObject() {} 
protected: 
    DllObject() { m_count = 3; } 
private: 
    int m_count; 
}; 

परियोजना बी में, पूर्वप्रक्रमक MYDLL_BUILD परिभाषित नहीं है:

#if !defined(MYDLL_BUILD) 
    # pragma comment(lib, "myDll.lib") 
    #endif 

    #if defined(MYDLL_BUILD) 
    # define MYDLL_API __declspec(dllexport) 
    #else 
    # define MYDLL_API __declspec(dllimport) 
    #endif 

तब मैं आधार वर्ग परिभाषित करते हैं। यहाँ व्युत्पन्न वर्ग है:

class MyClass : public DllObject 
{ 
public: 
    ~MyClass(){} 
    MyClass() { m_data = 20; } 
private: 
    int m_data; 
}; 

मैं dll और lib फ़ाइल को शामिल किया है, लेकिन अभी भी मैं अनसुलझे बाह्य प्रतीक त्रुटि मिलती है:

2>Test_Entry.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual __thiscall ADAI::DllObject::~DllObject(void)" ([email protected]@@[email protected]) referenced in function "public: virtual __thiscall MyClass::~MyClass(void)" ([email protected]@[email protected]) 
2>Test_Entry.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) protected: __thiscall ADAI::DllObject::DllObject(void)" ([email protected]@@[email protected]) referenced in function "public: __thiscall MyClass::MyClass(void)" ([email protected]@[email protected]) 
2>c:\Users\Adai\Documents\Visual Studio 2010\Projects\Test_Main\Debug\Test_Main.exe : fatal error LNK1120: 2 unresolved externals 

मैं ऑनलाइन खोज की, अधिकतर उत्तर का दावा है कि lib लापता है लेकिन वे निर्देश मेरी समस्या का समाधान नहीं करते हैं।

जब मैं बदल

class MYDLL_API DllObject 

class __declspec(dllexport) DllObject 

का हल कोई त्रुटि के साथ संकलित करता है। मैं वास्तव में कारण समझ में नहीं आता। क्या कोई मदद कर सकता है? अग्रिम में धन्यवाद।

+1

लगता है कि 'एडीएलएल_एपीआई' को प्रोजेक्ट ए में परिभाषित नहीं किया जा रहा है जैसा कि आप इसकी उम्मीद कर रहे हैं। फ़ाइल के प्रीप्रोसेस्ड संस्करण को उत्पन्न करने के लिए वीएस प्राप्त करें जिसमें DllObject परिभाषित किया गया है (फ़ाइल पर राइट क्लिक करें, गुणों पर जाएं, सी/सी ++ का विस्तार करें और प्रीप्रोसेसर विकल्पों में देखें)। सुनिश्चित करें कि आउटपुट में 'वर्ग __declspec (dllexport) DllObject' है और' वर्ग __declspec (dllimport) DllObject' – Praetorian

+0

नहीं है जो आपके द्वारा पोस्ट किए गए कोड स्निपेट के लिए लिंकर त्रुटियां उत्पन्न नहीं की जा सकती हैं। आपने हेडर फ़ाइल में कोड लिखा था। तो जब आप इसे शामिल करते हैं, तो डीएलएल के सभी पर कोई निर्भरता नहीं है। Lib। यदि हम वास्तविक कोड को नहीं देख रहे हैं, तो यह बस आपके जैसा लगता है कि किसी भी तरह से _DDL_BUILD को सही तरीके से परिभाषित नहीं किया गया है। –

+0

उत्तर देने के लिए धन्यवाद। DllObject में केवल एक हेडर फ़ाइल है, कोई सीपीपी फ़ाइल नहीं है। मैं DllObject के लिए एक preprocessed फ़ाइल उत्पन्न नहीं कर सकता। प्रीप्रोसेसर MYDLL_BUILD को प्रोजेक्ट ए के गुणों में परिभाषित किया गया है। उपरोक्त चिपकाए गए कोड वास्तविक कोड हैं, लेकिन यह केवल वह हिस्सा है जो मुझे त्रुटि संदेश से संबंधित लगता है। – Chtoucas

उत्तर

6

कारण इनलाइनिंग है।

संक्षेप में, इनलाइन कार्यों संभव सी ++ समारोह का एक ही परिभाषा शामिल है और त्रुटियों के कारण बिना एकाधिक संकलन इकाइयों (मूल रूप से सीपीपी फ़ाइलें) में संकलित किया जा करने की अनुमति चाहिए बनाने के लिए। कंपाइलर कर सकते हैं, लेकिन इस परिभाषाओं में से किसी के लिए कोड उत्सर्जित करने की आवश्यकता नहीं है। फिर लिंकर को एक प्रति चुनने की अनुमति है।

इस dll निर्माण पेचीदा है क्योंकि आप वास्तव में एक प्रतिलिपि लेकिन संकलक निर्यात करने के लिए पता नहीं है जो कॉपी सही एक है की जरूरत है। इस मामले में DllObject.cpp पर कुछ कोड जोड़कर आपने DllObject के लिए कंपाइलर उत्सर्जन कोड बनाया और लिंकर को निर्यात करने के लिए DllObject::~DllObject की कुछ प्रतिलिपि थी।

मैं आपको अपने विशेष मामले के अधिक विस्तृत विवरण, क्योंकि मैं अपनी परियोजना के लिए पूर्ण स्रोत और संकलन विकल्प नहीं जानता नहीं दे सकता।

+3

तो .cpp मॉड्यूल में .h सहित। इसे बनाने के लिए पर्याप्त नहीं था? आपको लगता है कि डीएलएल पीढ़ी इसे कम से कम एक त्रुटि के रूप में ध्वजांकित कर सकती है ... –

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