我正在尝试在我的代码中使用vtk,但是我在运行示例时遇到了问题。我几乎不知道原因,因为这是我第一次使用它而且我不是很有经验。 我正在使用visual studio 2012和x64平台。 因为我不知道应该使用哪些库,所以我将它们全部添加到“附加依赖项”中。 该示例在this link中给出。 问题是,当我运行它时,窗口显示此消息
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.
有谁知道如何解决这个问题,或者至少这个错误是什么意思?
答案 0 :(得分:21)
我也遇到了这个错误。该错误意味着链接器无法找到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)
答案 1 :(得分:14)
根据VTK migration guide,如果您没有使用CMake编译代码,则需要添加一些#define
。对于VTK 6.0,这些行需要 之前的任何其他VTK #include
:
#define vtkRenderingCore_AUTOINIT 4(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingFreeTypeOpenGL,vtkRenderingOpenGL)
#define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL)
答案 2 :(得分:4)
您的CMakeLists.txt文件中缺少include(${VTK_USE_FILE})
。
答案 3 :(得分:3)
假设您正在使用OpenGL2,您应该初始化vtkRenderingOpenGL2
模块,确保其对象工厂正确注册:
VTK_MODULE_INIT(vtkRenderingOpenGL2)
您应该将全局范围内的此宏(例如main.cpp
)称为documented in the source code:
初始化命名模块,确保其对象工厂 已正确注册和未注册。必须进行此调用 可执行文件的翻译单元中的全局范围(可以 包含一个共享库,但在静态中不会按预期工作 库)。
#include "vtkAutoInit.h" VTK_MODULE_INIT(vtkRenderingOpenGL);
如果包含在全局范围内的上述代码段将确保
vtkRenderingOpenGL
的对象工厂已正确注册 未注册的。
您如何知道要包含哪个模块?
最简单的方法是在VTK构建文件夹中搜索"vtkClassThatNeedsAnOverride"
,例如"vtkPolyDataMapper"
(请注意使用引号"
。)并查找{{1}在搜索结果中:
渲染/ OpenGL2 / vtkRenderingOpenGL2ObjectFactory.cxx:
*ObjectFactory
寻找this->RegisterOverride("vtkPolyDataMapper",
"vtkOpenGLPolyDataMapper",
"Override for vtkRenderingOpenGL2 module", 1,
vtkObjectFactoryCreatevtkOpenGLPolyDataMapper);
可能更有利。
存在哪些对象工厂?
要获取可初始化的所有现有模块的列表,您可以搜索RegisterOverride("vtkPolyDataMapper"
。 _AutoInit_Construct
是由*_AutoInit_Construct
调用的方法。
作为替代方案,您可以查看从vtkObjectFactory
派生的所有类。
第二种方法是查找对RegisterOverride
的所有来电。
更多信息
VTK_MODULE_INIT
VTK_MODULE_INIT
,使用 cmake 手动致电include(${VTK_USE_FILE})
请注意,我最初为duplicate question编写了这个答案,但我认为有关解决此问题的一般信息可能对其他具有相同错误消息的人有用。
答案 4 :(得分:2)
我建议您遵循指南here,其中VTK_MODULE_INIT宏最可靠,the guide here提供所需更改的高级概述。例如,您必须链接到vtkRenderingOpenGL才能获得大多数标准覆盖。如果您使用CMake,那么在find_ENTSage的COMPONENTS参数上指定它将导致它被添加到VTK_LIBRARIES,并且包括VTK_USE_FILE将导致添加正确的编译器定义。
答案 5 :(得分:1)
使用ParaView的Catalyst库时,除include("${PARAVIEW_USE_FILE}")
外还必须添加以下内容:
set_property(DIRECTORY APPEND PROPERTY COMPILE_DEFINITIONS ${VTK_DEFINITIONS})
答案 6 :(得分: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} 。
答案 7 :(得分:1)
我在我的平台上遇到了同样的问题; Visual Studio 2015 Windows 7的 VTK 6.3
我从Marcus D. Hanwell的帖子中跟随VTK/Build System Migration,它有效。我的附加线是;
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL);
VTK_MODULE_INIT(vtkInteractionStyle);
位于预处理器的顶部。与RestlessC0bra的帖子的不同之处可能是OpenGL版本。