前言
vtk installing and runing is absolutely a nightmare for newcommers.
一方面网上信息良莠不齐,实际按照某一个来做的,最后总会碰到一些奇怪的问题。另一方面,vtk本身也在快速迭代,之前能跑通的code,现在已经不能用了。结果就是尽管网上有这么多参考资料,新手(就是笔者了)还是陷入迷茫,并且每个能踩得坑都踩下去了。
我觉得这种情形很像Harry Potter and Half Blood Prince里的魔药课,新手只知其然,而不知其所以然,教条的按照步骤做,反而做得满头大汗并且效果不好。希望本文能像Potter手中那本带批注的魔药书,以最快的方式得到minimum runnable code(MRC).(笔者也是在调通程序后,以此为基础,去伪存真,将那些无效的操作去除,复杂的操作简化)
CMAKE (Why)
CMake解决一个问题,如果只有一套source code,如何方便的供不同开发环境(windows or linux)的开发者使用。CMake会根据CMakeLists.txt中的设置,将source code转化成不同平台相对应的项目文件。在visual studio的环境下,就是生成对应的solution。每一个有CmakeList文件的工程目录,都可以通过cmake来生成一个对应的solution.
1. 用Cmake将vtk源代码转化成VStudio Solution并编译
a. 生成项目文件
创建3个文件夹,分别vtk-source, vtk-install, vtk-prefix.
vtk-source用来存放下载的vtk源文件(解压后)。
vtk-install用来放Cmake生成的solution project。
vtk-prefix用来存放将来include的头文件.h,二进制库lib,动态库dll文件。
下面就是Configure Cmake:
这个填vtk-prefix的路径
设置qt,以及对应的path,我的是E:\ProgramFiles\Qt\5.11.3\msvc2017_64
不需要build example,vtk官网上有,浏览器运行看效果。据说是要额外下载vtk data, example才能build.
examples.vtk.org/site/Cxx/https://examples.vtk.org/site/Cxx/Configure结束后,generate项目文件,点Open Project打开vtk solution。
也可以在vtk-install文件夹下,手动打开vtk solution
b. vtk编译
在debug模式下,编译All_Build,这个过程大概半个小时。
在debug模式下,编译install,用来生成vtk-prefix里的内容。
release模式同样来一遍,可以先不用,不影响开发。
这样就完成了vtk的安装.
c. 添加环境变量
搜索环境变量,将E:\ProgramFiles\vtk-prefix\bin加入到系统变量Path里,这样程序在运行时就不会报dll找不到的错误.
dll这个文件属于动态链接库,需要在执行时加载
环境变量的作用就是指定某些文件,如.h,lib,dll等的位置。当编译器进行编译时,需要调用某些文件时,就会按照环境变量指定的路径来寻找所需文件。其寻找顺序是:
① 当前工程目录下
② VS环境变量提供的目录
③ 系统环境变量提供的目录
当然也可以将项目所用的dll都copy到当前工程目录debug下,但这样一方面会污染项目目录,另一方面在新建一个项目的时候还要再重新copy一遍。
改完后要重启计算机
2. 编写第一个vtk+qt程序
a. 新建Qt Widgets Application
1. 加入OpenGL Module
2. include header and lib
Project Property/VC++ Directories/include directories后面加入prefix/include文件夹
(E:\ProgramFiles\vtk-prefix\include\vtk-9.3)
Library Directories后加入prefix/lib 文件夹 (E:\ProgramFiles\vtk-prefix\lib)
这样做加入了vtk头文件和库文件。引用的时候就不会有红色波浪线。
3. 将vtk lib的名字加入linker的input,如果不加的话,会报symbol unrecognized
linker链接器的作用是将编译好的.obj文件,和.lib,.res 文件链接成可执行程序,这里不能出现.cpp,.h,.dll文件。
E:\ProgramFiles\vtk-prefix\lib\*d.lib
注意到lib folder下面名字后缀带d的是debug用的,没有则是release用。
如果是build debug 用*d.lib来filter,
如果是release,要将configure改成release, 用*3.lib来filter
b. Property Manager 重复使用设置
可以将上面的设置保持下来,在创建新项目的时候直接导入就可以。
visual studio 通过 Property Manager 来创建新的项目属性,供其它项目使用。
点击【View】-【Other Windows】-【Property Manager】
添加新的Property Sheet, 将之前这些设置重新做在这个上面
将生成的PropertySheet保持在公共目录下
在创建新的vtk项目的时候,可以直接导入之前保持的PropertySheet,可以避免前面繁琐的设置。
c. 生成一个简单的cone程序
#include "vtkTest1.h"
#include <vtkActor.h>
#include <vtkNew.h>
#include <vtkPolyDataMapper.h>
#include <vtkProperty.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkRenderer.h>
#include <vtkConeSource.h>
#include <QVTKOpenGLNativeWidget.h>
vtkTest1::vtkTest1(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
QVTKOpenGLNativeWidget* pVTKWidget = new QVTKOpenGLNativeWidget();
this->setCentralWidget(pVTKWidget);
vtkNew<vtkConeSource> cone;
vtkNew<vtkPolyDataMapper> mapper;
vtkNew<vtkActor> actor;
vtkNew<vtkRenderer> renderer;
renderer->SetBackground(.3, .6, .3);
// Connect
mapper->SetInputConnection(cone->GetOutputPort());
actor->SetMapper(mapper);
renderer->AddActor(actor);
pVTKWidget->renderWindow()->AddRenderer(renderer);
}
vtkTest1::~vtkTest1()
{}
参考文献
VTK和Cmake的安装并运行一个vtk的案例_cmakevtk-CSDN博客https://blog.csdn.net/qq_42277704/article/details/127807374