1、下载vtk-5.10.zip、vtkdata-5.10.zip、vtkDocHtml-5.10.tar.gz、Cmake
四个文件。
2、安装 Cmake
3、解压 vtk-5.10.zip、vtkdata-5.10.zip、到指定文件夹c:\vtk下面。
4、在新建文件夹bin,此时c:\vtk下面包含三个文件夹,vtk、vtkdata、bin.
5、运行cmake 编译vtk的源码,source 选择vtk-5.10.zip 的存放文件夹 Binaries 选择bin 文件夹。
6、单击configure ,弹出对话框选择编译器,尽量选择高版本的编译器。单击下一步。
7、360防火墙会有提示病毒攻击电脑,添加信任。
8、等待编译完成,下面进行设置。
1、vtk_data_root:一般地,cmake 可以自己找到vtkdata 的路径,但如果没有,把vtkdata路径选定。目的是告诉cmake,vtk需要的数据都在哪里。
2、cmake_install_prefix:这个比较重要,就是以后要安装vtk 的路径。上面例子的安装路径是:c:\vtk。有些人又要问,我编译完了不就可以用vtk了吗,为什么还要安装?对,不安装其实可以,安装的好处就是可以从1G 多的文件中提取出.h .lib .dll 等精华,安装在指定目录下,并修改系统环境变量。
3、build_examples: 就是询问是否编译vtk 中的例子,如选则on,就要花时间把vtk的例子编译一遍。
4、build_testing: test code 就是vtk 开发者用来测试vtk 代码的一些测试代码,我们常常把它们当成学习vtk 的例子,与build_examples 类似,是否编译他们,看个人喜好。
5、build_shared_libs: 如果设置为off,就只会生成lib 文件,用于开发肯定是够了。如果设置为on,将会多生成dll 文件。他们的区别不是我这里说得清楚的,反正如果用静态库编程,应用程序可以独立运行,尺寸也比较大,如果用动态库编程,应用程序必须找到动态库才能运行,但尺寸可以做得比较小。
6、vtk_use_parallel: 对于想用vtk 做并行计算的朋友,要把这个选上,对于只想学学vtk 的,保持默认off
7、vtk_use_guisupport:很多人把vtk 安装好了,却无法运行vtk 中与mfc 混合编程的例子,提示错误都是缺少vtkmfc.lib,问题就出在这个选项,我们必须把它设置为 on,再次configure之后,会出现一个新的选项vtk_use_mfc,把它也设置为on 就行了。vtk_use_guisupport 这个选项在点ShowAdvancedValues 才能出现。选择后按configure 选项直到没有红色为止。这个是选择vtk_use_guisupport ON 后vtk_use_mfc 也选择ON。
提示:在cmake 中,有些选项是依赖于另一些选项的,比如vtk_use_guisupport和vtk_use_mfc,当我们禁用vtk_use_guisupport,vtk_use_mfc 是看不到的。修改完 cmake 选项以后,不停的按configure按钮,直到没有选项显示为红色,而且此时,ok 按钮可用,点击ok 按钮,就可以生成vc 的工程文件了。
上面的选项如果没有 就勾选Advance 选项查看。
8 生成 ALL BUILD 和INSTALL 两个工程。第二个是安装 VTK,可以不生成。
9、编译完成之后在创建的文件夹bin下面会有个debug文件夹,下面就是修改环境变量,在环境变量的path下面添加debug文件夹的完整路径。
10、下面开始进行测试。详见医学图像编程技术。
11 、下面进行配置 关键部分
1编译完成之后在创建的文件夹bin下面会有个debug文件夹,在环境变量的path下面添加debug文件夹的完整路径。
2将安装文件 vtkinstall 下的bin 路径也添加到环境变量
3 将c:\vtk\ bin\Debug中的.dll文件拷贝到C:\WINDOWS\system32中。如果没有复制过去对例子进行build没有错误,但运行时却出现缺少DLL文件的提示。
4 重新启动电脑
5 在C/C++,常规,附加包含目录中,添加目录
C:\VTK\VTK5.10\GenericFiltering,
C:\VTK\VTK5.10\Common
C:\VTK\VTK5.10\IO
C:\VTK\VTK5.10\Filtering,
D:\VTK \bin,
C:\VTK\VTK5.10\Rendering,
C:\VTK\VTK5.10\Graphics,
C:\VTK\VTK5.10\VolumeRendering,
C:\VTK\VTK5.10\Imaging,
C:\VTK\VTK5.10\Hybrid,
C:\VTK\VTK5.10\GUISupport,
C:\VTK\VTK5.10\Parallel,
C:\VTK\VTK5.10\include\vtk-5.0,
C:\VTK\VTK5.10\lib 最后面这两个文件夹 我的没有 于是没有添加
这一步也可以直接将C:\VTK\bin\bin\Debug 这两个包含就好了不用上面那么多这里无非就是找头文件
6 在链接器,输入,附加依赖项中,添加lib:
opengl32.lib
kernel32.lib
user32.lib
gdi32.lib
winspool.lib
comdlg32.lib
advapi32.lib
shell32.lib
ole32.lib
oleaut32.lib
uuid.lib
odbc32.lib
odbccp32.lib
vtkCommon.lib
vtkDICOMParser.lib
vtkexoIIc.lib
vtkexpat.lib
vtkFiltering.lib
vtkfreetype.lib
vtkftgl.lib
vtkGenericFiltering.lib
vtkGraphics.lib
vtkHybrid.lib
vtkImaging.lib
vtkIO.lib
vtkjpeg.lib
vtkNetCDF.lib
vtkpng.lib
vtkRendering.lib
vtksys.lib
vtktiff.lib
vtkVolumeRendering.lib
vtkWidgets.lib
vtkzlib.lib
7 在链接器,常规,附加库中,添加目录C:\VTK \bin\bin\Debug C:\VTK\VTKinstall\lib\vtk-5.10 这里就是找lib 文件。
包含目录:
#include<headerfile.h>中headerfile.h的搜索目录。也就是头文件的存放目录。如果有XXX.h找不到,设置这个目录可以解决。
附加依赖项:
C++的库会把函数、类的声明放在*.h中,实现放在*.cpp或*.cc中。编译之后,*.cpp,*.cc .c会被打包成一个.lib文件,这样可以保护源代码。
所以,要使用一个库,除了要include他的头文件以外,还要在链接过程中把lib加进去。这个就是在附加依赖项设置。
库目录:就是存放.lib文件的目录。
如果设置错误,会link error,提示"找不到XXX.lib"。
测试:
#include "vtkConeSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkRenderWindow.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
int main()
{
// 创建一个圆锥,并设置其参数:高度、底面半径和分辨率。
vtkConeSource *cone = vtkConeSource::New();
cone->SetHeight( 3.0 );
cone->SetRadius( 1.0 );
cone->SetResolution( 10 );// 决定其棱角的多少
// 创建一个多边形映射器,用于把多边形数据映射为可被计算机渲染的图元。
vtkPolyDataMapper *coneMapper =vtkPolyDataMapper::New();
coneMapper->SetInputConnection(cone->GetOutputPort() );
// 创建一个演员,并关联一个映射器,从而确定了演员的形状。
vtkActor *coneActor = vtkActor::New();
coneActor->SetMapper( coneMapper );
// 创建一个渲染器,添加要被渲染的演员,设置背景颜色。
vtkRenderer *ren1= vtkRenderer::New();
ren1->AddActor( coneActor );
ren1->SetBackground( 0.1, 0.2, 0.4 );
// 创建渲染窗口,供渲染器渲染用。
vtkRenderWindow *renWin =vtkRenderWindow::New();
renWin->AddRenderer( ren1 );
renWin->SetSize( 300, 300 );
// 渲染360次,这里主要是为了延时。
int i;
for (i = 0; i< 360; ++i) renWin->Render();
// 清除对象。
cone->Delete();
coneMapper->Delete();
coneActor->Delete();
ren1->Delete();
renWin->Delete();
return 0;
}