从DLL导出类 [英] Exporting classes from a DLL

查看:122
本文介绍了从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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆