这几天安装VTK安装得很崩溃,趁现在还记得怎么安装,记录一下,也希望能帮助到别的安装VTK的人。
首先主体教程参照http://www.cnblogs.com/opengl/articles/2256528.html,中间有修改的部分。
在 《VTK安装配置教程》修改整理而成,原文为VC6的安装指南,详见:http://blog.csdn.net/ralix/article/details/2070051
1. 必须要下载的东西,vs2008已经装好为前提:
vtk-5.8.0-win32.exe 安装程序
vtk-5.8.0.zip 源程序
vtkdata-5.8.0.zip 数据
vtkDocHtml VTK手册(可选)
cmake-2.8.6-win32-x86
2. 先执行 vtk-5.8.0-win32.exe安装到d:\Program Files (x86)\VTK 5.8.0, 安装后会产生 vtk5.0 文件夹里面还包括 bin 等子文件夹。
(project setting也是按这个目录配置的)
3. 将 vtk-5.0.4.zip解压到d:\Program Files (x86)\VTK 5.8.0,即解压后为:d:\Program Files (x86)\VTK 5.8.0\vtk5.8.0; vtkdata-5.0.4.zip同样处理。
4. 安装 cmake-2.8.6-win32-x86,方便起见装到d:\Program Files (x86)\cmake-2.8.6-win32-x86。运行cmake,设置sourse code目录为D:/Program Files (x86)/VTK 5.8.0/vtk5.8.0, build目录为D:/Program Files (x86)/VTK 5.8.0/bin
按 configure 按钮,cmake 软件会让你选择需要使用的编译器,这里我们选vs2008,然后cmake会描所需要的文件,停下来之后,我们就可以修改 cmake选项了。
至于vtk_use_qvtk,这是给QT用的vtk,但目前只支持QT3,现在的版本是QT4,我试过了,cmake通不过。只能等着新版cmake了。
还有要注意的就是:
vtk_data_root: 目的是告诉cmake,vtk 需要的数据都在哪里,我们的数据在d:\Program Files (x86)\VTK 5.8.0\vtk5.8.0\vtkdata
cmake_install_prefix: 这个是指定一个目录把.h .lib .dll等精华放在这里,"VTK安装三步曲"里说是为将来装vtk做准备,我不太清楚,反正用它默认的就好了。
build_examples: 就是询问是否编译 vtk 中的例子,你在看这个教程,说明肯定是初次用VTK,建议选上。
build_shared_libs: 如果设置为off,就只会生成lib 文件,用于开发肯定是够了。如果设置为on,将会多生成 dll 文件,这些dll需要拷到windows/system目录下。如果用静态库编程,即off时,应用程序可以独立运行,尺寸也比较大,如果用动态库编程,即on时,应用程序必须找到动态库才能运行,但尺寸可以做得比较小。建议选On, 我试过选OFF,所谓的静态编译,但之后新建一个项目时,还是会出现找不到文件的问题。
vtk_use_parallel: 对于想用vtk 做并行计算的朋友,要把这个选上,对于只想学学vtk 的,保持默认 off
都没问题了所有项目会变成灰色。这时就可以按OK了,几秒钟后,cmake自动退出,为VC6准备的make文件已经生成好。
5. 用 vs2008打开 bin目录下的 d:\Program Files (x86)\VTK 5.8.0\bin\VTK.sln 文件,直接build。这一般要花掉十几分钟。结果保存在d:\Program Files (x86)\VTK 5.8.0\bin\bin。如果这个过程报错,可能是防火墙、杀毒软件的原因,请关掉再试。顺利通过编译就可以继续了。
在Cmake中打开Show Advanced Values再configure,才可以看到一个vtk_use_guisupport,打开它,才能选vtk_use_mfc,再configure,configure的次数是无所谓的。
很多人把 vtk 安装好了,却无法运行vtk 中与mfc 混合编程的例子,提示错误都是缺少vtkmfc.lib,问题就出在这个选项,我们必须把它设置为 on。
用 vs2008打开 bin目录下的 d:\Program Files (x86)\VTK 5.8.0\bin\VTK.sln 文件,直接build。顺利通过编译就可以继续了。
6. 第4步时build_shared_libs是ON的话,把C:/VTK 5.0/bin/bin/Debug里生成的dll文件都拷到windows/system目录下。
7. 试一下:打开d:\Program Files (x86)\VTK 5.8.0\bin\Examples\VTKExamples.sln,选择Cone项目,右键set as active project,然后build,run. 这时应该能正确运行了。
8.安装后对VTK做一些设置,首先在tools-》options-》projections and solutions-》VC++ Directions-》在右边show directions for 下拉列表中选择Include files,添加头文件目录,即.h文件所在的目录。选择下拉列表Library files 添加库文件目录,即.lib文件所在目录。这两步设置好之后,新建的项目可以识别这些文件中包含的头文件和库文件,是比较快捷的方法。
8. 自建的项目还需要做以下设定,编译后出现头文件或者库文件读取不出的问题,可以在项目中特别添加相应的目录:项目上右键
properties-》C/C++ ->General->Additional include directories:添加头文件的目录
properties-》Linker->Input->Additional Dependencies:添加库文件名
properties-》Linker->General->additional Libraries Directions:添加库文件目录
像Cannot open include file: 'vtkConeSource.h':这样的错误都是上面三大步没走对或dll没拷到windows/system下造成的。要建立新项目,必须重新配置三大步,因为那三步都是Project setting里的,新项目没有默认这些设置。
如果某个项目再提示缺什么lib或.h的话,再临时加上去就行了。
9. 这时新建一个project, win32 console application, an empty project, 生成后给source files加一个test.cpp,把下面的代码放进去:
#include "vtkConeSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkRenderWindow.h"
#include "vtkCamera.h"
#include "vtkActor.h"
#include "vtkRenderer.h"
#include "vtkProperty.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 );
int i;
for (i = 0; i < 360; ++i)
{
renWin->Render();
ren1->GetActiveCamera()->Azimuth( i );
}
cone->Delete();
coneMapper->Delete();
coneActor->Delete();
ren1->Delete();
renWin->Delete();
return 0;
}
看过vtk example的第一个例子就会知道上面的程序在做些什么。
补充:出现如下错误的话(我当时的错误未保存,这边从网上复制了一个),61>SampleDoc.obj : error LNK2019: 无法解析的外部符号 "__declspec(dllimport) public: static class vtkDataSetReader * __cdecl vtkDataSetReader::New(void)" (__imp_?New@vtkDataSetReader@@SAPAV1@XZ),该符号在函数 "protected: __thiscall CSampleDoc::CSampleDoc(void)" (??0CSampleDoc@@IAE@XZ) 中被引用。
修改方法是对vtkDLG\vtkMDI\vtkSDI\win32sampleMFC分别添加vtkIO.lib的路径和库文件名。