首先,我对 dll 编程还很陌生。所以我正在编写一个 UI dll,它应该对我的项目有帮助。问题是我遇到了错误,这些错误并没有真正说明什么,而且我有点困惑。 所以我有一个名为 UIContainer 的类,女巫应该是我的基类,所有其他(按钮等)都从中派生。因为我将它们保存在 UIContainer 类型的指针列表中,所以我必须使用虚拟方法。但是当把虚拟语句放在我的方法之前时,它给了我错误所以我研究了一个发现,我必须将它们声明为纯虚拟方法所以我创建了 UIElement 类,它只是 UIContainer 能够使用的接口(interface)虚方法,并且不必在从 UIContainer 派生的每个类中重新实现它们。但是现在我得到了这些错误并且无法真正解释原因。有人有想法吗?
Error 42 error LNK2001: Unresloved external symbol ""__declspec(dllimport) const Button::`vftable'" (__imp_??_7Button@@6B@)".
Error 43 error LNK2001: Unresloved external symbol ""__declspec(dllimport) const UIContainer::`vftable'" (__imp_??_7UIContainer@@6B@)".
Error 44 error LNK2001: Unresloved external symboll ""__declspec(dllimport) const UIElement::`vftable'" (__imp_??_7UIElement@@6B@)".
Error 45 error LNK1120: 3 unresloved externals
(请注意,我试图将错误翻译成英语,因为我来自德国,因此会出现德语错误;))
最佳答案
所以我找到了问题所在。 如果您在 dll 中使用虚拟方法,则必须为 im/export 单独声明所有方法。
举个例子:
#ifdef UICONATINER_EXPORTS
#define UICONATINER_API __declspec(dllexport)
#else
#define UICONATINER_API __declspec(dllimport)
#endif
通常您会像这样将类定义为 ex/import:
class UICONATINER_API UIContainer
...
但是如果虚拟方法不起作用,你必须这样做 对于每个方法:
class UIContainer
{
...
UICONATINER_API void unfocused();
UICONATINER_API void draw();
...
}
关于c++ - DLL编程(C++ | MSVS) 虚拟和派生,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26832115/