VTK 7.0 安装中内存读取冲突 no override found for “.." 解决记录

来源:互联网 发布:数据安全保护策略 编辑:程序博客网 时间:2024/06/05 20:15


因为毕设要求,所以用VTK来开发项目。实验室本来用的都是VTK5.10,这个版本虽然比较旧但是也比较稳定,安装过程不容易出错。但是由于需要兼容python3的缘故,所以我还是尝试了一下安装VTK(当然这也是以后发展的趋势)


安装的过程就不详细记录了,网上教程很多,官网上也有,我主要参考了VTK中国的中文教程:http://vtkchina.org/course/  虽然教程是也是正对旧版的,但是大部分的步骤都是一样的,少数的CMAKE中的配置也可以根据英文大概猜出意思。

还有就是官方的网站上面也有安装教程。(主要就是理解一下CMAKE中的几个参数设置的意思即可)


下面就记录一下遇到的 no override found for  的问题:

建立工程有两种方法,一种是通过CMAKE 来建立,一种是通过VS来建立。由于CMAKE相对来说操作比较麻烦,所以比较倾向于用VS直接建立工程。在VS中有三个地方要记得添加VTK生成的库,一个是C/C++中附加包含的库, 一个是在链接器里面常规下的包含目录,最后一个是输入里面添加要用的的.lib文件。

新建工程后报了如下的错误:



中断程序后显示的错误如下:





这个问题在网上也是找了很久的答案,都没有很好的解决问题,关于这个问题最详细的解答就是在官网上的:

http://www.vtk.org/Wiki/VTK/VTK_6_Migration/Factories_now_require_defines

主要两个方法,一个是添加如下代码:


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

这两行代码加在引用VTK类的最前面。

缺少几个模块就添加哪个初始化语句
另一个方法如下;

<pre name="code" class="cpp">#define vtkRenderingCore_AUTOINIT 4(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingFreeTypeOpenGL,vtkRenderingOpenGL)#define vtkRenderingVolume_AUTOINIT 1(vtkRenderingVolumeOpenGL)


但是我试了之后又会报出如下类似的错误(下面是官网上的)

"2>vtkSDIView.obj : error LNK2001: unresolved external symbol "void __cdecl vtkInteractionStyle_AutoInit_Construct(void)" (?vtkInteractionStyle_AutoInit_Construct@@YAXXZ) 2>vtkSDI.cpp.obj : error LNK2001: unresolved external symbol "void __cdecl vtkInteractionStyle_AutoInit_Destruct(void)"(?vtkInteractionStyle_AutoInit_Destruct@@YAXXZ)"

官网上给的解决方法是:

After linking all the libraries found in the example code (eg the Cone example) these link errors go away. This required adding several tens of new libraries that I had not needed to link for version 5.8 which is slightly annoying. The preprocessor definitions I mention above can also be copied from the Cone example.

意思就是说把example中用到的库全部加载过来,这些链接的错误也就没有了,这也将是一件很繁琐的事情。

所以综上所述,要么就乖乖的用CMAKe创建工程,要么就要加一大堆的库文件。

但是我通过仔细的对比发现,其实自己建的工程只有一个地方与CMAKE不同,那就是:

预处理器定义。所以把CMAKE生成的预处理器定义拷贝过去就可以了:

看看CMAKE的预处理器定义:

WIN32;_WINDOWS;_DEBUG;vtkDomainsChemistry_AUTOINIT=1(vtkDomainsChemistryOpenGL2);vtkRenderingContext2D_AUTOINIT=1(vtkRenderingContextOpenGL2);vtkRenderingCore_INCLUDE="<span style="color:#ff0000;">E:/taro/vtk/IRAEE/bin/CMakeFiles/vtkRenderingCore_AUTOINIT_vtkInteractionStyle_vtkRenderingFreeType_vtkRenderingOpenGL2.h</span>";vtkRenderingVolume_AUTOINIT=1(vtkRenderingVolumeOpenGL2);CMAKE_INTDIR="Debug";%(PreprocessorDefinitions)

仔细看这个其实和官网上给的第二种方法原理是一样。都是初始化这些模块。但是这里明显就比较齐全,所以拷贝这个就可以了目录换成自己的。关于当中引用的.h文件,其实也是一个模块初始化定义如下:

#define vtkRenderingCore_AUTOINIT 3(vtkInteractionStyle,vtkRenderingFreeType,vtkRenderingOpenGL2)

SO ,自己创建工程后,添加库和包含文件,最后修改一下预处理器的定义就没有问题了


当然这只是开始学习VTK的第一步,后面还有很多东西要学习,其实这个安装问题花了两天才解决,主要原因是自己对C++的环境不是很熟悉,VTK的资料大都是英文,看起来比较费劲,还有就是很多外网上不去,导致很多信息都看不到。不过万事开头难,下面就要正式开始学习怎么使用VTK 了!

1 0