【问题标题】:Unresolved external symbol vftable c++未解析的外部符号vftable c ++
【发布时间】:2012-06-30 22:37:55
【问题描述】:

我在我的 MFC + vtk 项目中使用 Visual Studio 2008。我收到如下链接错误:

vtkPBFEAView.obj : 警告 LNK4217: 本地定义符号 ?DrawDC@vtkMFCWindow@@QAEXPAVCDC@@@Z (public: void __thiscall vtkMFCWindow::DrawDC(class CDC *)) 在函数“protected: virtual void __thiscall CvtkPBFEAView: :OnDraw(类 CDC *)" (?OnDraw@CvtkPBFEAView@@MAEXPAVCDC@@@Z)

1>vtkMDIView.obj : 警告 LNK4049: 已导入本地定义的符号 ?DrawDC@vtkMFCWindow@@QAEXPAVCDC@@@Z (public: void __thiscall vtkMFCWindow::DrawDC(class CDC *)) 1>vtkPBFEAView.obj : 警告 LNK4217: 本地定义的符号 ??0vtkMFCWindow@@QAE@PAVCWnd@@@Z (public: __thiscall vtkMFCWindow::vtkMFCWindow(class CWnd *)) 在函数“public: void __thiscall vtkPBFEAViewImpl::initialize”中导入(类 CWnd *)" (?initialize@vtkPBFEAViewImpl@@QAEXPAVCWnd@@@Z)

1>vtkMDIView.obj : 警告 LNK4049: 已导入本地定义符号 ??0vtkMFCWindow@@QAE@PAVCWnd@@@Z (public: __thiscall vtkMFCWindow::vtkMFCWindow(class CWnd *)) 1>vtkPBFEAView.obj : 警告 LNK4217: local defined symbol ??1vtkMFCWindow@@UAE@XZ (public: virtual __thiscall vtkMFCWindow::~vtkMFCWindow(void)) 在函数“public: virtual void * __thiscall vtkMFCWindow::`scalar删除析构函数'(unsigned int)" (??_GvtkMFCWindow@@UAEPAXI@Z)

1>vtkMDIView.obj : 警告 LNK4217: 本地定义符号 ??1vtkMFCWindow@@UAE@XZ (public: virtual __thiscall vtkMFCWindow::~vtkMFCWindow(void)) 在函数“public: void __thiscall vtkMDIViewImpl::adjust_contours( int,double,double)" (?adjust_contours@vtkMDIViewImpl@@QAEXHNN@Z)

1>vtkMFCWindow.obj : error LNK2019: unresolved external symbol "_declspec(dllimport) const vtkMFCWindow::`vftable'" (_imp_??_7vtkMFCWindow@@6B@) 在函数中引用public: __thiscall vtkMFCWindow::vtkMFCWindow(class CWnd *)" (??0vtkMFCWindow@@QAE@PAVCWnd@@@Z)

谁能解释一下这个错误的原因?

提前致谢。

【问题讨论】:

  • 有一个类似的问题asked here,看看对你有没有帮助。
  • 感谢@satuon 的链接。我现在正在用 dll 文件构建 vtk,但它之前有 udes 静态库。可能这就是问题所在,所以我正在尝试使用静态库构建 vtk,我发现之前很难构建。你有什么建议吗?再次感谢。
  • 在链接中我给出的解决方案是使用共享库而不是静态库构建(它们打开 BUILD_SHARED_LIBS)。你这样做了吗?
  • 是的。我正在使用 SHARED_LIBS 选项,并且正在链接所有库。
  • 那么,您现在是使用共享库构建,还是使用静态库构建?我问是因为您之前说过“所以我正在尝试使用静态库构建 vtk”。

标签: visual-studio-2008 visual-c++ mfc vtk


【解决方案1】:

对于其他可能找到此解决方案并对其 DLL 函数不再导出以供客户端应用程序使用感到不安的人:

MSVC 的 DLL 模板提供以下样板:

#ifdef DLLNAME_EXPORTS
  #define DLLNAME_API __declspec(dllexport)
#else
  #define DLLNAME_API __declspec(dllimport)
#endif

如果您忘记在项目设置中定义 DLLNAME_EXPORTS,您将收到此消息。如果您重命名这些#defines,就会发生这种情况

【讨论】:

    【解决方案2】:

    我终于找到了问题的答案。就是 vtkMFCWindow 配置了 /MD 选项,而我的主项目配置了 /MTd 选项。因此我得到了错误。一旦我删除了 __declspec( dllexport ) 行并且它运行良好。 感谢您的帮助。

    【讨论】:

      猜你喜欢
      • 2013-02-28
      • 2012-11-19
      • 1970-01-01
      • 2012-12-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多