未找到"vtkPolyDataMapper"的覆盖

no override found for 'vtkPolyDataMapper'

本文关键字:覆盖 vtkPolyDataMapper      更新时间:2023-10-16

我正在尝试在我的代码中使用 vtk,但我在运行示例时遇到问题。我几乎不知道原因,因为这是我第一次使用它,而且我不是很有经验。我使用的是Visual Studio 2012和x64平台。由于我真的不知道应该使用哪些库,因此我将它们全部添加到"其他依赖项"中。此链接中给出了示例。问题是当我运行它时,窗口显示此消息

Generic Warning: In C:locationVTK6.0.0RenderingCorevtkPolyDataMapper.cxx, line 27
Error: no override found for 'vtkPolyDataMapper'.

对应于此行

// Return NULL if no override is supplied.
vtkAbstractObjectFactoryNewMacro(vtkPolyDataMapper)

视觉工作室显示的错误是

First-chance exception at 0x000007F7AA106C8F in Test.exe: 0xC0000005: Access violation reading location 0x0000000000000000.

有谁知道如何解决这个问题,或者至少这个错误意味着什么?

我也遇到了这个错误。该错误意味着链接器找不到 vtkPolyDataMapper 方法的定义。在构建过程中,必须注意他们使用了哪个 vtk 渲染后端。它可能是vtkRenderingOpenGL或vtkRenderingOpenGL2。转到您的 build/lib 文件夹并搜索其中任何一个。我有VS 2015社区,并拥有vtkRenderingOpenGL2,vtk-7.1构建在Windows 8.1,x86_64平台,发布配置。

我通过在源文件的最顶部插入以下 3 行来解决此问题,在任何其他预处理器指令之前:

#include "vtkAutoInit.h" 
VTK_MODULE_INIT(vtkRenderingOpenGL2); // VTK was built with vtkRenderingOpenGL2
VTK_MODULE_INIT(vtkInteractionStyle);

这将初始化指定的 VTK 模块。CMake 默认包含这些内容,但其他编译器(如 VS)不包含。

最后两行可以合并为以下内容:

#define vtkRenderingCore_AUTOINIT 2(vtkRenderingOpenGL2, vtkInteractionStyle)

根据 VTK 迁移指南,如果不使用 CMake 编译代码,则需要添加一些#define。对于 VTK 6.0,这些行需要先于任何其他 VTK #include

#define vtkRenderingCore_AUTOINIT 4(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingFreeTypeOpenGL,vtkRenderingOpenGL)
#define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL)
您的

CMakeLists.txt 文件中缺少include(${VTK_USE_FILE})

假设您使用的是 OpenGL2,您应该初始化 vtkRenderingOpenGL2 模块,确保其对象工厂已正确注册:

VTK_MODULE_INIT(vtkRenderingOpenGL2)

您应该在全局范围内调用此宏(例如。 main.cpp ),如源代码中所述:

初始化命名模块,确保其对象工厂 已正确注册和取消注册。此调用必须在 可执行文件的翻译单元中的全局范围(可以 包含共享库,但在静态库中无法按预期工作 库)。

#include "vtkAutoInit.h"
VTK_MODULE_INIT(vtkRenderingOpenGL);

如果上述代码段包含在全局范围内,将确保 vtkRenderingOpenGL的对象工厂已正确注册,并且 注册。

您如何知道要包含哪个模块?

最简单的方法是在 VTK 构建文件夹中搜索"vtkClassThatNeedsAnOverride",即 "vtkPolyDataMapper"在您的情况下(请注意"引号的使用)并在搜索结果中查找*ObjectFactory

Rendering/

OpenGL2/vtkRenderingOpenGL2ObjectFactory.cxx:

this->RegisterOverride("vtkPolyDataMapper",
                       "vtkOpenGLPolyDataMapper",
                       "Override for vtkRenderingOpenGL2 module", 1,
                       vtkObjectFactoryCreatevtkOpenGLPolyDataMapper);

寻找RegisterOverride("vtkPolyDataMapper"可能更有益。

存在哪些对象工厂?

要获取可以初始化的所有现有模块的列表,可以搜索 _AutoInit_Construct*_AutoInit_ConstructVTK_MODULE_INIT调用的方法。

作为替代方法,您可以查看派生自 vtkObjectFactory 的所有类。

第二种选择是查找所有对RegisterOverride的调用。

更多信息

  • VTK 6 迁移:工厂现在需要定义
  • 构建系统迁移:无需使用 cmake 手动调用VTK_MODULE_INIT,只需在CMakeLists.txt中调用 include(${VTK_USE_FILE})

请注意,我最初为重复的问题编写了此答案,但我认为有关解决此问题的一般信息可能会引起具有相同错误消息的其他人的兴趣。

我建议遵循此处的指南,VTK_MODULE_INIT宏是最可靠的,此处的指南提供了所需更改的高级概述。例如,您必须链接到vtkRenderingOpenGL才能获得大多数标准覆盖。如果使用 CMake,则在 COMPONENTS 参数上指定它find_package将导致将其添加到VTK_LIBRARIES,并且包含VTK_USE_FILE将导致添加正确的编译器定义。

我的平台上遇到了同样的问题;Visual Studio 2015视窗 7VTK 6.3

我从Marcus D. Hanwell的帖子中关注了VTK/Build System Migration,它有效。我的附加行是;

#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle);

在预处理器的顶部。与RestlessC0bra的帖子不同的可能是OpenGL版本。

使用 ParaView 的 Catalyst 库时,除了include("${PARAVIEW_USE_FILE}")之外,还必须添加以下内容:

set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS ${VTK_DEFINITIONS})

一个快速的破解解决方案:在CMakeList.txt文件中,将vtkRendering${VTK_RENDERING_BACKEND}替换为vtkRenderingOpenGL2。我们需要这个的原因是因为 Cmake 不知道渲染核心在哪里。通过指定它,我们可以使用渲染核心来覆盖正确的方法。

正确的解决方案应将整个find_package段替换为:

find_package(VTK REQUIRED COMPONENTS vtkCommonCore) 
find_package(VTK COMPONENTS 
   vtkFiltersSources
   vtkInteractionStyle
   vtkRendering${VTK_RENDERING_BACKEND})

第一个find_package让 CMake 知道在哪里可以找到包,然后第二个find_package知道在哪里可以找到 vtkRendering${VTK_RENDERING_BACKEND}