VS2013编译VTK7.1.1

Posted AijunHe

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了VS2013编译VTK7.1.1相关的知识,希望对你有一定的参考价值。

1.下载VTK

从VTK官网可以下载Source,Data,以及Documentation:VTK Download
VTK安装分为binary install和source code install两种方式,binary install可以下载vtk.exe直接安装VTK,开发直接在Tcl中进行;source code install需要下载CMake进行configure/generate,开发可以使用C++,Java,Python,Tcl等任意方式,因此本文下载Source进行编译。
解压Source到D:\\VTK-7.1.1。
 

2.安装CMake

安装CMake,参见官网:CMake
此处下载cmake-3.8.0-rc4-win64-x64.msi,并安装。

3.运行CMake对VTK进行配置

运行CMake,其界面如下:
将下载到的VTK源码文件VTK-7.1.1.zip解压到某个磁盘下,比如,解压到D:\\Toolkits\\VTK\\VTK-7.1.1。然后,建立一个空的文件夹,叫什么名字无所谓,只要不含有中文即可(为了让文件名看起来规整统一,新建的文件夹命名为VTK-7.1.1-bin,完整的路径为:D:\\Toolkits\\VTK\\VTK-7.1.1-bin)。接着解压下载的VTKData-7.1.1.zip文件,比如解压到:D:\\Toolkits\\VTK\\VTK-7.1.1 (如果你没有下载VTKData-7.1.1.zip文件,这一步也可以跳过)。

 

配置源代码路径和目标路径,在CMake界面上的“Where is the source code”文本框里输入前一步解压VTK-7.1.1.zip之后的路径,即D:\\Toolkits\\VTK\\VTK-7.1.1。也就是这个文本框应该输入VTK源码目录里最外层的CMakeLists.txt文件所在的路径。接着,在“Where to build the binaries”文本框里输入前一步新建的空文件夹的路径,即D:\\Toolkits\\VTK\\VTK-7.1.1-bin,这个文本框所输的路径可以跟“Where is the source code”的一样,分开两个不同的路径的好处是后续编译过程生成的文件不会跟VTK的源码混合在一起,避免对源码目录的“污染”,这也是后续内容介绍的CMake的“in-place”和“out-of-place”的区别。
配置好源代码路径和目标路径后的CMake如下图所示:

 

以上两个文本框输入完之后,按“Configure”按钮,会弹出如下图所示的对话框,在Specify the generator for this project处选择Visual Studio 12 2013 Win64:

点Finish,回CMake的主界面,CMake即开始根据具体的平台环境配置VTK工程,配置时间会因硬件配置的不同而不同,一般需要几分钟时间。

 配置完成后,CMake界面如下图所示:

Configure完成后会出来红色的扫描结果,根据自己需要对其中的选项进行勾选。

关于VTK的一些CMake配置选项的说明:

BUILD_EXAMPLES —默认是关闭的,如果打开这个选项,则会编译VTK例子,同时VTK编译所需的时间也较长,占用的磁盘空间也较大。对于初学者来说,建议把这个选项打开。

BUILD_SHARED_LIBS —默认是关闭的,意味着VTK是静态编译;如果打开这个选项,则是动态编译。

“静态编译”与“动态编译”的区别:静态编译就是在编译的时候把所有的模块都编译进可执行文件(exe)里去,当启动这个可执行文件时所有的模块都已加载进来。动态编译则是编译的时候需要的模块都没有编译进去,一般情况下可以把这些模块都编译成动态链接库DLL,启动程序(初始化)的时候这些模块不会被加载,运行的时候用到那个模块就调用哪个DLL文件。静态链接库编译相当于你带着一个工具包到处跑,遇到有需要的地方不需要周围的环境提供相应的工具,自己用自己工具包的工具就行了,所以当环境发生变化可以尽可能的无视;动态链接库编译相当于不带任何东西,走到哪是哪。这两者的区别显然就是前者重量增加了,即程序的体积会比后者的大。

所以,究竟是用“静态编译”还是“动态编译”,关键看自己的需要。对于VTK初学者而言,所涉及到的工程可能都比较小,建议用“静态编译”,也方便把VTK程序移植到其他没有安装VTK的计算机上运行。本书的VTK类库是采用静态编译。

BUILD_TESTING —默认是打开的,表示会编译VTK的测试程序。VTK里每个类都有对应的程序文件对该类进行测试,对于初学者而言,可以关闭掉这个选项,后续如有需要,可以再打开此选项。

VTK_DATA_ROOT —指向VTKData所在的路径,即第1章里下载的文件vtkdata-5.10.0.zip解压后的路径。一般情况下,VTK能够自动搜索到,如果没有搜索到可以手动输入,在运行VTK的例子时需要用到这些数据。

CMAKE_INSTALL_PREFIX —这个选项表示VTK的安装路径,默认的路径是:C:/Program Files/VTK。该选项的值可不作更改,按默认值即可。

VTK_USE_QT —是否使用Qt。在这个系列里,我们使用Qt作为GUI开发工具,所以勾上该选项。

VTK_WRAP_JAVAVTK_WRAP_PYTHONVTK_WRAP_TCL —这三个选项是供准备使用Java、Python或者Tcl语言开发VTK工程的用户选择的。VTK由两个子系统组成,分别是C++类库和提供给Java、Tcl和Python来操作该类库的解释器工具,如果勾上以上三个选项,即会编译这些解释器工具。

勾选图2.3的“Advance”复选框,可以在CMake界面上看到更多的选项,各选项分别表示什么意思,可以把鼠标在该选项名字停留片刻,即会弹出关于该选项的提示信息。另外“Advance”视图下以下几个选项需要说明一下:

BUILD_DOCUMENTATION —默认是关闭的,如果打开这个选项,则会编译VTK帮助文档,由于这个文档VTK已提供下载,所以可以不选。

VTK_USE_GUISUPPORT — VTK是否支持GUI,Windows下如果需要使用MFC开发的,需要勾选上这个选项。本教程在演示的时候也会把这个选项勾选,如果你确定不使用MFC,可以不用选择该选项。

定制每个选项的值以后,按“Configure”按钮,继续配置,CMake界面如图2.4所示。

CMAKE_INSTALL_PREFIX为默认安装路径,也是INSTALL工程生成的地方,可以选择D:/VTK-7.1.0-build/。
BUILD推荐勾选如下:
INSTALL选项下的内容不用管,默认值就行。
如果需要使用Python,需要勾选VTK_WRAP_PYHTON,并在PYTHON选项下配置好相关路径,否则会出现CMake Could NOT find PythonLibs错误,PYTHON选项配置如下:
其中INCLUDE_DIR是再次Configure之后出现的。
系统中配置好QT的环境变量QTDIR,并在PATH中加入%QTDIR%/bin,则QT部分选项默认即可。
根据需要对VTK_Group进行勾选:
修改完成后重新Configure,然后Generate。

3.生成VTK

打开D:\\VTKv7-build下的VTK.sln,右键点击ALL_BUILD,选择重新生成,该步骤耗时较长。
第一次生成后会有一些链接错误,比如打不开..\\..\\lib\\Debug下的vtkViewsInfovisPython27D-7.1.lib文件,可能是由于生成顺序导致,因此再生成一遍,可以减少一部分错误。
生成成功后找到INSTALL项目,右击选择仅用于项目->仅生成INSTALL,会在CMAKE_INSTALL_PREFIX设置的目录下生成include目录,包含VTK需要的头文件。

4.错误解决

4.1 vtkWrappingPythonCore项目无法打开文件“python27.lib”

找到该项目,在属性中添加附加链接库D:\\S\\D\\python-install\\libs

4.2 vtkImagingMorphological项目无法打开文件“..\\..\\lib\\Debug\\vtkCommonDataModelPython27D-7.1.lib”

找到跟vtkCommonDataModel相关的项目,查看属性->链接器->高级中的导入库部分,即为该项目生成后输出的lib文件,经查看,vtkCommonDataModelPython的输出为vtkCommonDataModelPython.lib,而vtkCommonDataModelPythonD项目的输出为vtkCommonDataModelPython27D-7.1.lib,因此遇到无法打开文件Python27D-7.1.lib错误时,生成相应的PythonD项目,并且该项目的附加库要添加python\\libs目录。
 
注:由于加入python过于繁琐,加上项目不需要python,所以取消python重新进行编译,后续所用的VTK并没有加入python。

5.运行Examples

5.1 CMake编译

运行CMake,source code处选择源代码位置,例如:D:/VTK-7.1.0/Examples/Tutorial/Step1/Cxx,build the binaries选择工程文件生成处,例如:D:/VTKCode/Step1。
第一次configure之后需要填入一些参数,其中VTK_DIR填入VTKConfig.cmake所在路径,一般情况下是安装VTK时配置的生成路径, 即为D:\\VTK-7.1.0-build,CMAKE_INSTALL_PREFIX是生成INSTALL.vcxproj的地方,默认是C盘,可以修改到工程文件生成目录下,configure之后generate。
编译之后到工程文件目录下,可以找到Step1.sln,打开之后选择Cone作为启动项目进行生成,生成成功即可运行。

5.2 新建项目编译

启动VS2013,新建一个空项目,将D:/VTK-7.1.0/Examples/Tutorial/Step1/Cxx/Cone.cxx复制到新建项目的目录下,在新项目中添加Cone.cxx到源文件处。
配置项目的属性,在VC++目录下,包含目录添加生成的include文件,例如:D:\\VTK-7.1.0-build\\include\\vtk-7.1,库目录添加lib文件,例如:D:\\VTK-7.1.0-build\\lib。
链接器的附加依赖项填入lib目录下的所有.lib文件,如下所示:
  1. kernel32.lib  
  2. user32.lib  
  3. gdi32.lib  
  4. winspool.lib  
  5. shell32.lib  
  6. ole32.lib  
  7. oleaut32.lib  
  8. uuid.lib  
  9. comdlg32.lib  
  10. advapi32.lib  
  11. comctl32.lib  
  12. vfw32.lib  
  13. ws2_32.lib  
  14. wsock32.lib  
  15. opengl32.lib  
  16. vtkalglib-7.1.lib  
  17. vtkChartsCore-7.1.lib  
  18. vtkCommonColor-7.1.lib  
  19. vtkCommonComputationalGeometry-7.1.lib  
  20. vtkCommonCore-7.1.lib  
  21. vtkCommonDataModel-7.1.lib  
  22. vtkCommonExecutionModel-7.1.lib  
  23. vtkCommonMath-7.1.lib  
  24. vtkCommonMisc-7.1.lib  
  25. vtkCommonSystem-7.1.lib  
  26. vtkCommonTransforms-7.1.lib  
  27. vtkDICOMParser-7.1.lib  
  28. vtkDomainsChemistry-7.1.lib  
  29. vtkDomainsChemistryOpenGL2-7.1.lib  
  30. vtkexoIIc-7.1.lib  
  31. vtkexpat-7.1.lib  
  32. vtkFiltersAMR-7.1.lib  
  33. vtkFiltersCore-7.1.lib  
  34. vtkFiltersExtraction-7.1.lib  
  35. vtkFiltersFlowPaths-7.1.lib  
  36. vtkFiltersGeneral-7.1.lib  
  37. vtkFiltersGeneric-7.1.lib  
  38. vtkFiltersGeometry-7.1.lib  
  39. vtkFiltersHybrid-7.1.lib  
  40. vtkFiltersHyperTree-7.1.lib  
  41. vtkFiltersImaging-7.1.lib  
  42. vtkFiltersModeling-7.1.lib  
  43. vtkFiltersParallel-7.1.lib  
  44. vtkFiltersParallelImaging-7.1.lib  
  45. vtkFiltersPoints-7.1.lib  
  46. vtkFiltersProgrammable-7.1.lib  
  47. vtkFiltersSelection-7.1.lib  
  48. vtkFiltersSMP-7.1.lib  
  49. vtkFiltersSources-7.1.lib  
  50. vtkFiltersStatistics-7.1.lib  
  51. vtkFiltersTexture-7.1.lib  
  52. vtkFiltersVerdict-7.1.lib  
  53. vtkfreetype-7.1.lib  
  54. vtkGeovisCore-7.1.lib  
  55. vtkgl2ps-7.1.lib  
  56. vtkglew-7.1.lib  
  57. vtkGUISupportQt-7.1.lib  
  58. vtkGUISupportQtSQL-7.1.lib  
  59. vtkhdf5_hl-7.1.lib  
  60. vtkhdf5-7.1.lib  
  61. vtkImagingColor-7.1.lib  
  62. vtkImagingCore-7.1.lib  
  63. vtkImagingFourier-7.1.lib  
  64. vtkImagingGeneral-7.1.lib  
  65. vtkImagingHybrid-7.1.lib  
  66. vtkImagingMath-7.1.lib  
  67. vtkImagingMorphological-7.1.lib  
  68. vtkImagingSources-7.1.lib  
  69. vtkImagingStatistics-7.1.lib  
  70. vtkImagingStencil-7.1.lib  
  71. vtkInfovisCore-7.1.lib  
  72. vtkInfovisLayout-7.1.lib  
  73. vtkInteractionImage-7.1.lib  
  74. vtkInteractionStyle-7.1.lib  
  75. vtkInteractionWidgets-7.1.lib  
  76. vtkIOAMR-7.1.lib  
  77. vtkIOCore-7.1.lib  
  78. vtkIOEnSight-7.1.lib  
  79. vtkIOExodus-7.1.lib  
  80. vtkIOExport-7.1.lib  
  81. vtkIOGeometry-7.1.lib  
  82. vtkIOImage-7.1.lib  
  83. vtkIOImport-7.1.lib  
  84. vtkIOInfovis-7.1.lib  
  85. vtkIOLegacy-7.1.lib  
  86. vtkIOLSDyna-7.1.lib  
  87. vtkIOMINC-7.1.lib  
  88. vtkIOMovie-7.1.lib  
  89. vtkIONetCDF-7.1.lib  
  90. vtkIOParallel-7.1.lib  
  91. vtkIOParallelXML-7.1.lib  
  92. vtkIOPLY-7.1.lib  
  93. vtkiosQL-7.1.lib  
  94. vtkIOTecplotTable-7.1.lib  
  95. vtkIOVideo-7.1.lib  
  96. vtkIOXML-7.1.lib  
  97. vtkIOXMLParser-7.1.lib  
  98. vtkjpeg-7.1.lib  
  99. vtkjsoncpp-7.1.lib  
  100. vtklibxml2-7.1.lib  
  101. vtkLocalExample-7.1.lib  
  102. vtkmetaio-7.1.lib  
  103. vtkNetCDF_cxx-7.1.lib  
  104. vtkNetCDF-7.1.lib  
  105. vtkoggtheora-7.1.lib  
  106. vtkParallelCore-7.1.lib  
  107. vtkpng-7.1.lib  
  108. vtkproj4-7.1_d.lib  
  109. vtkRenderingAnnotation-7.1.lib  
  110. vtkRenderingContext2D-7.1.lib  
  111. vtkRenderingContextOpenGL2-7.1.lib  
  112. vtkRenderingCore-7.1.lib  
  113. vtkRenderingFreeType-7.1.lib  
  114. vtkRenderingGL2PSOpenGL2-7.1.lib  
  115. vtkRenderingImage-7.1.lib  
  116. vtkRenderingLabel-7.1.lib  
  117. vtkRenderingLOD-7.1.lib  
  118. vtkRenderingOpenGL2-7.1.lib  
  119. vtkRenderingQt-7.1.lib  
  120. vtkRenderingVolume-7.1.lib  
  121. vtkRenderingVolumeOpenGL2-7.1.lib  
  122. vtksqlite-7.1.lib  
  123. vtksys-7.1.lib  
  124. vtkTestingGenericBridge-7.1.lib  
  125. vtkTestingIOSQL-7.1.lib  
  126. vtkTestingRendering-7.1.lib  
  127. vtktiff-7.1.lib  
  128. vtkverdict-7.1.lib  
  129. vtkViewsContext2D-7.1.lib  
  130. vtkViewsCore-7.1.lib  
  131. vtkViewsInfovis-7.1.lib  
  132. vtkViewsQt-7.1.lib  
  133. vtkzlib-7.1.lib  
kernel32.lib
user32.lib
gdi32.lib
winspool.lib
shell32.lib
ole32.lib
oleaut32.lib
uuid.lib
comdlg32.lib
advapi32.lib
comctl32.lib
vfw32.lib
ws2_32.lib
wsock32.lib
opengl32.lib
vtkalglib-7.1.lib
vtkChartsCore-7.1.lib
vtkCommonColor-7.1.lib
vtkCommonComputationalGeometry-7.1.lib
vtkCommonCore-7.1.lib
vtkCommonDataModel-7.1.lib
vtkCommonExecutionModel-7.1.lib
vtkCommonMath-7.1.lib
vtkCommonMisc-7.1.lib
vtkCommonSystem-7.1.lib
vtkCommonTransforms-7.1.lib
vtkDICOMParser-7.1.lib
vtkDomainsChemistry-7.1.lib
vtkDomainsChemistryOpenGL2-7.1.lib
vtkexoIIc-7.1.lib
vtkexpat-7.1.lib
vtkFiltersAMR-7.1.lib
vtkFiltersCore-7.1.lib
vtkFiltersExtraction-7.1.lib
vtkFiltersFlowPaths-7.1.lib
vtkFiltersGeneral-7.1.lib
vtkFiltersGeneric-7.1.lib
vtkFiltersGeometry-7.1.lib
vtkFiltersHybrid-7.1.lib
vtkFiltersHyperTree-7.1.lib
vtkFiltersImaging-7.1.lib
vtkFiltersModeling-7.1.lib
vtkFiltersParallel-7.1.lib
vtkFiltersParallelImaging-7.1.lib
vtkFiltersPoints-7.1.lib
vtkFiltersProgrammable-7.1.lib
vtkFiltersSelection-7.1.lib
vtkFiltersSMP-7.1.lib
vtkFiltersSources-7.1.lib
vtkFiltersStatistics-7.1.lib
vtkFiltersTexture-7.1.lib
vtkFiltersVerdict-7.1.lib
vtkfreetype-7.1.lib
vtkGeovisCore-7.1.lib
vtkgl2ps-7.1.lib
vtkglew-7.1.lib
vtkGUISupportQt-7.1.lib
vtkGUISupportQtSQL-7.1.lib
vtkhdf5_hl-7.1.lib
vtkhdf5-7.1.lib
vtkImagingColor-7.1.lib
vtkImagingCore-7.1.lib
vtkImagingFourier-7.1.lib
vtkImagingGeneral-7.1.lib
vtkImagingHybrid-7.1.lib
vtkImagingMath-7.1.lib
vtkImagingMorphological-7.1.lib
vtkImagingSources-7.1.lib
vtkImagingStatistics-7.1.lib
vtkImagingStencil-7.1.lib
vtkInfovisCore-7.1.lib
vtkInfovisLayout-7.1.lib
vtkInteractionImage-7.1.lib
vtkInteractionStyle-7.1.lib
vtkInteractionWidgets-7.1.lib
vtkIOAMR-7.1.lib
vtkIOCore-7.1.lib
vtkIOEnSight-7.1.lib
vtkIOExodus-7.1.lib
vtkIOExport-7.1.lib
vtkIOGeometry-7.1.lib
vtkIOImage-7.1.lib
vtkIOImport-7.1.lib
vtkIOInfovis-7.1.lib
vtkIOLegacy-7.1.lib
vtkIOLSDyna-7.1.lib
vtkIOMINC-7.1.lib
vtkIOMovie-7.1.lib
vtkIONetCDF-7.1.lib
vtkIOParallel-7.1.lib
vtkIOParallelXML-7.1.lib
vtkIOPLY-7.1.lib
vtkIOSQL-7.1.lib
vtkIOTecplotTable-7.1.lib
vtkIOVideo-7.1.lib
vtkIOXML-7.1.lib
vtkIOXMLParser-7.1.lib
vtkjpeg-7.1.lib
vtkjsoncpp-7.1.lib
vtklibxml2-7.1.lib
vtkLocalExample-7.1.lib
vtkmetaio-7.1.lib
vtkNetCDF_cxx-7.1.lib
vtkNetCDF-7.1.lib
vtkoggtheora-7.1.lib
vtkParallelCore-7.1.lib
vtkpng-7.1.lib
vtkproj4-7.1_d.lib
vtkRenderingAnnotation-7.1.lib
vtkRenderingContext2D-7.1.lib
vtkRenderingContextOpenGL2-7.1.lib
vtkRenderingCore-7.1.lib
vtkRenderingFreeType-7.1.lib
vtkRenderingGL2PSOpenGL2-7.1.lib
vtkRenderingImage-7.1.lib
vtkRenderingLabel-7.1.lib
vtkRenderingLOD-7.1.lib
vtkRenderingOpenGL2-7.1.lib
vtkRenderingQt-7.1.lib
vtkRenderingVolume-7.1.lib
vtkRenderingVolumeOpenGL2-7.1.lib
vtksqlite-7.1.lib
vtksys-7.1.lib
vtkTestingGenericBridge-7.1.lib
vtkTestingIOSQL-7.1.lib
vtkTestingRendering-7.1.lib
vtktiff-7.1.lib
vtkverdict-7.1.lib
vtkViewsContext2D-7.1.lib
vtkViewsCore-7.1.lib
vtkViewsInfovis-7.1.lib
vtkViewsQt-7.1.lib
vtkzlib-7.1.lib
需要注意的是,本次配置并未将.dll文件复制到C:\\Windows\\System32或者C:\\Windows\\SysWOW64下,如果是WIN7则需要复制,本机系统是WIN10,只在Path中添加了VTK的.dll文件所在目录。
由于本机系统是64位系统,VTK.sln编译的时候也选择的是Debug x64,因此新建的项目应在配置管理器中将活动解决方案平台换成x64方可生成成功。
运行Cone,出现Error: no override found for \'vtkPolyDataMapper\'.错误,经查找资料,由于未使用CMake进行配置,因此需要在源代码开头加入如下代码:
  1. #include <vtkAutoInit.h>  
  2. VTK_MODULE_INIT(vtkRenderingOpenGL2);  
  3. VTK_MODULE_INIT(vtkInteractionStyle);  
#include <vtkAutoInit.h>
VTK_MODULE_INIT(vtkRenderingOpenGL2);
VTK_MODULE_INIT(vtkInteractionStyle);
该方法适用于VTK7.0及以上版本,其他版本可参考下列资料:

以上是关于VS2013编译VTK7.1.1的主要内容,如果未能解决你的问题,请参考以下文章

vs2013打开的cpp文件如何编译

LinuxC++开发面试系列:代码运行gcc编译system函数与VS2013 C4996解决方法

在windows7上用vs2013编译和调试mysql源代码

用VS2013编译FFMPEG232

LinuxC++开发面试系列:代码运行gcc编译system函数与VS2013 C4996解决方法

LinuxC++开发面试系列:代码运行gcc编译system函数与VS2013 C4996解决方法