20

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

Generic Warning: In C:\location\VTK6.0.0\Rendering\Core\vtkPolyDataMapper.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.

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

4

8 回答 8

32

我也遇到了这个错误。该错误意味着链接器找不到 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)
于 2017-01-31T22:56:23.823 回答
14

根据VTK迁移指南,如果你没有使用CMake编译你的代码,你需要添加一些#defines. 对于 VTK 6.0,这些行需要放在任何其他 VTK之前#include

#define vtkRenderingCore_AUTOINIT 4(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingFreeTypeOpenGL,vtkRenderingOpenGL)
#define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL)
于 2013-10-29T14:10:41.447 回答
5

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

于 2013-09-12T20:59:33.213 回答
3

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

VTK_MODULE_INIT(vtkRenderingOpenGL2)

您应该在源代码中记录main.cpp的全局范围(例如)中调用此宏:

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

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

如果包含在全局范围内,上面的代码片段将确保对象工厂vtkRenderingOpenGL正确注册和注销。

你怎么知道要包含哪个模块?

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

渲染/OpenGL2/vtkRenderingOpenGL2ObjectFactory.cxx:

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

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

存在哪些对象工厂?

要获取您可以初始化的所有现有模块的列表,您可以搜索_AutoInit_Construct. *_AutoInit_Construct是由 调用的方法VTK_MODULE_INIT

作为替代方案,您可以查看所有派生自vtkObjectFactory.

第二种选择是查找所有对RegisterOverride.

更多信息

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

于 2017-06-18T14:08:21.303 回答
2

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

于 2013-11-02T04:03:28.497 回答
2

我在我的平台上遇到了同样的问题;视觉工作室 2015 视窗 7 VTK 6.3

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

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

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

于 2017-02-15T22:47:46.707 回答
1

使用 ParaView 的 Catalyst 库时,您必须添加以下内容include("${PARAVIEW_USE_FILE}")

set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS ${VTK_DEFINITIONS})
于 2014-10-09T13:57:59.393 回答
1

快速破解解决方案:在 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}

于 2016-06-15T19:38:09.020 回答