从DLL导出类 [英] Exporting classes from a DLL
问题描述
我无法从DLL导出菱形结构中的类:
Hi,
I''m having trouble exporting classes in a diamond structure from a DLL:
#ifdef DLLDLL_EXPORTS
#define DLLDLL_API __declspec(dllexport)
#else
#define DLLDLL_API __declspec(dllimport)
#endif
class DLLDLL_API CBase
{
...
};
class DLLDLL_API CDerivedA : virtual public CBase
{
...
};
class DLLDLL_API CDerivedB : virtual public CBase
{
...
};
class DLLDLL_API CDerivedAB : public CDerivedA, public CDerivedB
{
...
};
类的函数,构造函数和析构函数给出链接错误.
我能够导出普通类和派生类,但是我不知道该怎么做,所以我希望有人可以帮忙.
CTest.h:
The functions, constructors and destructors of the classes give a linking error.
I''m capable of exporting normal and derived classes but I can''t figure out how to do this, so I hope someone can help if this is even possible.
CTest.h:
#ifdef DLLDLL_EXPORTS
#define DLLDLL_API __declspec(dllexport)
#else
#define DLLDLL_API __declspec(dllimport)
#endif
class DLLDLL_API CBase
{
private:
int identifier;
protected:
CBase (int ID);
TCHAR szText [40];
};
class DLLDLL_API CDerivedA : virtual public CBase
{
public:
CDerivedA (int ID);
void SetTextA (TCHAR* sz);
void ShoutA (HWND hwnd);
};
class DLLDLL_API CDerivedB : virtual public CBase
{
public:
CDerivedB (int ID);
void SetTextB (TCHAR* sz);
void ShoutB (HWND hwnd);
};
class DLLDLL_API CDerivedAB : public CDerivedA, public CDerivedB
{
public:
CDerivedAB (int ID);
void SetTextAB ();
void ShoutAB (HWND hwnd);
};
CTest.cpp
CTest.cpp
#include "CTest.h"
CBase::CBase (int ID)
{
identifier = ID;
}
CDerivedA::CDerivedA (int ID) : CBase (ID)
{}
void CDerivedA::SetTextA (TCHAR* sz)
{
_tcscpy (szText, sz);
}
void CDerivedA::ShoutA (HWND hwnd)
{
MessageBox (hwnd, szText, TEXT ("DerivedA:"), MB_OK);
}
CDerivedB::CDerivedB (int ID) : CBase (ID)
{}
void CDerivedB::SetTextB (TCHAR* sz)
{
_tcscpy (szText, sz);
}
void CDerivedB::ShoutB (HWND hwnd)
{
MessageBox (hwnd, szText, TEXT ("DerivedB:"), MB_OK);
}
CDerivedAB::CDerivedAB (i<pre lang="text">
nt ID) :CBase(ID),CDerivedA(ID),CDerivedB(ID)
{}
void CDerivedAB :: SetTextAB()
{
SetTextA(TEXT("Text A"));
SetTextB(TEXT("Text B"));
}
错误:
nt ID) : CBase (ID), CDerivedA (ID), CDerivedB (ID)
{}
void CDerivedAB::SetTextAB ()
{
SetTextA (TEXT ("Text A"));
SetTextB (TEXT ("Text B"));
}
Errors:
Error 13 error LNK2001: unresolved external symbol "__declspec(dllimport) const CDerivedA::`vbtable'" (__imp_??_8CDerivedA@@7B@) J:\Programming\White Wings\DLL - General\CTest.obj
Error 14 error LNK2001: unresolved external symbol "__declspec(dllimport) const CDerivedB::`vbtable'" (__imp_??_8CDerivedB@@7B@) J:\Programming\White Wings\DLL - General\CTest.obj
Error 15 error LNK2001: unresolved external symbol "__declspec(dllimport) const CDerivedAB::`vbtable'{for `CDerivedB'}" (__imp_??_8CDerivedAB@@7BCDerivedB@@@) J:\Programming\White Wings\DLL - General\CTest.obj
Error 16 error LNK2001: unresolved external symbol "__declspec(dllimport) const CDerivedAB::`vbtable'{for `CDerivedA'}" (__imp_??_8CDerivedAB@@7BCDerivedA@@@) J:\Programming\White Wings\DLL - General\CTest.obj
编辑(带有析构函数):
Edit (with destructors):
class DLLDLL_API CBase
{
private:
int identifier;
protected:
CBase (int ID);
virtual ~CBase (){};
TCHAR szText [40];
};
class DLLDLL_API CDerivedA : virtual public CBase
{
public:
CDerivedA (int ID);
~CDerivedA (){};
void SetTextA (TCHAR* sz);
void ShoutA (HWND hwnd);
};
class DLLDLL_API CDerivedB : virtual public CBase
{
public:
CDerivedB (int ID);
~CDerivedB (){};
void SetTextB (TCHAR* sz);
void ShoutB (HWND hwnd);
};
class DLLDLL_API CDerivedAB : public CDerivedA, public CDerivedB
{
public:
CDerivedAB (int ID);
~CDerivedAB (){};
void SetTextAB ();
void ShoutAB (HWND hwnd);
};
错误:
Errors:
Error 73 error LNK2019: unresolved external symbol "__declspec(dllimport) const CBase::`vftable'" (__imp_??_7CBase@@6B@) referenced in function "protected: __thiscall CBase::CBase(int)" (??0CBase@@IAE@H@Z) J:\Programming\White Wings\DLL - General\CTest.obj
Error 74 error LNK2019: unresolved external symbol "__declspec(dllimport) const CDerivedA::`vftable'" (__imp_??_7CDerivedA@@6B@) referenced in function "public: __thiscall CDerivedA::CDerivedA(int)" (??0CDerivedA@@QAE@H@Z) J:\Programming\White Wings\DLL - General\CTest.obj
Error 75 error LNK2019: unresolved external symbol "__declspec(dllimport) const CDerivedA::`vbtable'" (__imp_??_8CDerivedA@@7B@) referenced in function "public: __thiscall CDerivedA::CDerivedA(int)" (??0CDerivedA@@QAE@H@Z) J:\Programming\White Wings\DLL - General\CTest.obj
Error 76 error LNK2019: unresolved external symbol "__declspec(dllimport) const CDerivedB::`vftable'" (__imp_??_7CDerivedB@@6B@) referenced in function "public: __thiscall CDerivedB::CDerivedB(int)" (??0CDerivedB@@QAE@H@Z) J:\Programming\White Wings\DLL - General\CTest.obj
Error 77 error LNK2019: unresolved external symbol "__declspec(dllimport) const CDerivedB::`vbtable'" (__imp_??_8CDerivedB@@7B@) referenced in function "public: __thiscall CDerivedB::CDerivedB(int)" (??0CDerivedB@@QAE@H@Z) J:\Programming\White Wings\DLL - General\CTest.obj
Error 78 error LNK2019: unresolved external symbol "__declspec(dllimport) public: virtual __thiscall CDerivedA::~CDerivedA(void)" (__imp_??1CDerivedA@@UAE@XZ) referenced in function __unwindfunclet$??0CDerivedAB@@QAE@H@Z$0 J:\Programming\White Wings\DLL - General\CTest.obj
Error 79 error LNK2019: unresolved external symbol "__declspec(dllimport) protected: virtual __thiscall CBase::~CBase(void)" (__imp_??1CBase@@MAE@XZ) referenced in function __unwindfunclet$??0CDerivedAB@@QAE@H@Z$0 J:\Programming\White Wings\DLL - General\CTest.obj
Error 80 error LNK2019: unresolved external symbol "__declspec(dllimport) const CDerivedAB::`vftable'" (__imp_??_7CDerivedAB@@6B@) referenced in function "public: __thiscall CDerivedAB::CDerivedAB(int)" (??0CDerivedAB@@QAE@H@Z) J:\Programming\White Wings\DLL - General\CTest.obj
Error 81 error LNK2019: unresolved external symbol "__declspec(dllimport) const CDerivedAB::`vbtable'{for `CDerivedB'}" (__imp_??_8CDerivedAB@@7BCDerivedB@@@) referenced in function "public: __thiscall CDerivedAB::CDerivedAB(int)" (??0CDerivedAB@@QAE@H@Z) J:\Programming\White Wings\DLL - General\CTest.obj
Error 82 error LNK2019: unresolved external symbol "__declspec(dllimport) const CDerivedAB::`vbtable'{for `CDerivedA'}" (__imp_??_8CDerivedAB@@7BCDerivedA@@@) referenced in function "public: __thiscall CDerivedAB::CDerivedAB(int)" (??0CDerivedAB@@QAE@H@Z) J:\Programming\White Wings\DLL - General\CTest.obj
Error 83 error LNK1120: 10 unresolved externals J:\Programming\White Wings\Debug\DLL - General.dll
Error 106 error LNK2019: unresolved external symbol "__declspec(dllimport) public: void __thiscall CDerivedA::`vbase destructor'(void)" (__imp_??_DCDerivedA@@QAEXXZ) referenced in function "void __cdecl `long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)'::`2'::`dynamic atexit destructor for 'cDeriveda''(void)" (??__FcDeriveda@?1??WndProc@@YGJPAUHWND__@@IIJ@Z@YAXXZ) J:\Programming\White Wings\Testing\main.obj
Error 107 error LNK2019: unresolved external symbol "__declspec(dllimport) public: void __thiscall CDerivedAB::`vbase destructor'(void)" (__imp_??_DCDerivedAB@@QAEXXZ) referenced in function "void __cdecl `long __stdcall WndProc(struct HWND__ *,unsigned int,unsigned int,long)'::`2'::`dynamic atexit destructor for 'cDerivedAB''(void)" (??__FcDerivedAB@?1??WndProc@@YGJPAUHWND__@@IIJ@Z@YAXXZ) J:\Programming\White Wings\Testing\main.obj
Error 108 error LNK1120: 2 unresolved externals J:\Programming\White Wings\Debug\Testing.exe 1
推荐答案
?? 0CDerivedAB @@ QAE @ H @ Z
??0CDerivedAB@@QAE@H@Z
0 J:\ Programming \ White Wings \ DLL-General \ CTest.obj 错误79错误LNK2019:未解析的外部符号"__declspec(dllimport)受保护:虚拟__thiscall CBase ::〜CBase(void)"(__imp _ ?? 1CBase @@ MAE @ XZ)在函数__unwindfunclet
0 J:\Programming\White Wings\DLL - General\CTest.obj Error 79 error LNK2019: unresolved external symbol "__declspec(dllimport) protected: virtual __thiscall CBase::~CBase(void)" (__imp_??1CBase@@MAE@XZ) referenced in function __unwindfunclet
中引用
?? 0CDerivedAB @@ QAE @ H @ Z
??0CDerivedAB@@QAE@H@Z
这篇关于从DLL导出类的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!