неразрешенный внешний символ для __declspec(dllimport) при использовании dll для экспорта класса

Я хочу определить производный класс на основе класса, экспортированного из dll. Базовый класс определен в проекте A, а производный класс — в проекте B.

Во-первых, в проекте A определен препроцессор 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 MYDLL_API DllObject
{
public:
    virtual ~DllObject() {}
protected:
    DllObject() { m_count = 3; }
private:
    int m_count;
};

В проекте B препроцессор MYDLL_BUILD не определен. Вот производный класс:

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)" (__imp_??1DllObject@ADAI@@UAE@XZ) referenced in function "public: virtual __thiscall MyClass::~MyClass(void)" (??1MyClass@@UAE@XZ)
2>Test_Entry.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) protected: __thiscall ADAI::DllObject::DllObject(void)" (__imp_??0DllObject@ADAI@@IAE@XZ) referenced in function "public: __thiscall MyClass::MyClass(void)" (??0MyClass@@QAE@XZ)
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 

, решение компилируется без ошибок. Я действительно не понимаю причину. Может кто-нибудь помочь? Заранее спасибо.

16
задан Liviu 23 November 2016 в 12:17
поделиться