Qt5(MinGW)使用CMake编译与使用VTK6

本文使用的各软件版本如下:
Qt:5.4.0;
MinGW:4.9.1;
CMake:3.1.1;
VTK:6.1.0。

下载最新版Qt(MinGW版):http://www.qt.io/download-open-source/
下载最新版CMake:http://www.cmake.org/download/
下载最新版VTK:http://vtk.org/VTK/resources/software.html


编译VTK

安装Qt(安装过程中注意勾选安装MinGW)与CMake,并添加与Qt集成安装的MinGW可执行程序路径(Qt***/Tools/mingw***/bin,即mingw32-make.exe所在路径)到系统环境变量PATH
解压VTK,建议解压后路径不要包含中文与空格。

打开VTK目录下的CMakeLists.txt文件,在约第219行,将set(VTK_USE_WIN32_THREADS 1)修改为set(VTK_USE_PTHREADS 1),该处原始上下文为:

include(FindThreads)
set(VTK_USE_WIN32_THREADS 0)
set(VTK_USE_PTHREADS 0)
set(VTK_HP_PTHREADS 0)
set(VTK_USE_SPROC 0)
if(CMAKE_USE_WIN32_THREADS_INIT)
  set(VTK_USE_WIN32_THREADS 1)
  set(CMAKE_THREAD_LIBS_INIT "")
elseif(CMAKE_USE_PTHREADS_INIT)
  set(VTK_USE_PTHREADS 1)
  if(CMAKE_HP_PTHREADS_INIT)
    set(VTK_HP_PTHREADS 1)
  endif()
elseif(CMAKE_USE_SPROC_INIT)
  set(VTK_USE_SPROC 1)
endif()

打开VTK目录/ThirdParty/libxml2/vtklibxml2/threads.c,在文件开头#include "libxml.h"后添加行:#undef HAVE_WIN32_THREADS,修改后上下文为:

#define IN_LIBXML
#include "libxml.h"
#undef HAVE_WIN32_THREADS
#include <string.h>

启动CMake,并指定源代码路径和生成路径:
指定源代码与生成路径

配置生成器为MinGW:
配置生成器

点击CMake中的Configure进行第一次配置,配置完成后,勾选Search框后的GroupedAdvanced

CMAKE下设置CMAKE_INSTALL_PREFIX为编译完成后VTK期望的安装路径,如D:/VTK-6.1.0/MinGW
Module下勾选Module_vtkGUISupportQtModule_vtkGUISupportQtOpenGLModule_vtkGUISupportQtSQLModule_vtkGUISupportQtWebkitModule_vtkRenderingQtModule_vtkViewsQt
VTK下勾选VTK_Group_Qt
如果需要编译为静态链接库,在BUILD下取消勾选BUILD_SHARED_LIBS(如编译为静态链接库,使用时可能会遇到lib文件循环依赖问题)。
如果需要编译为Release,在CMAKE下修改CMAKE_BUILD_TYPERelease
如果需要在Debug模式下编译生成的库文件带d后缀,点击Add Entry,手动添加后缀项,NameCMAKE_DEBUG_POSTFIXTypeSTRINGValued
点击Add Entry,手动添加qmake所在路径,NameQT_QMAKE_EXECUTABLETypePATHValueqmake.exe所在完整路径:
设置QT_QMAKE_EXECUTABLE
点击Add Entry,手动添加Qt安装目录,NameCMAKE_PREFIX_PATHTypePATHValue为Qt安装目录(应为包含qmake.exebin的父目录,可对照上下两图):
设置CMAKE_PREFIX_PATH
再次点击Configure

此时将弹出错误:
Qt版本配置错误
Ungrouped Entries下将QT_VTK_VERSION修改为5,再次点击Configure

此时在界面下方的消息输出窗口中,将输出Configuring done,点击Generate
生成完成后,将输出Generating done

在最开始在CMake中指定的生成路径中打开命令行窗口,输入mingw32-make,开始编译生成:
开始编辑生成

编译完成后,执行mingw32-make install,将编译生成文件输出到已配置的CMAKE_INSTALL_PREFIX目录中,此时该目录中将有binincludelibpluginsshare文件夹。
如果在添加了d后缀进行编译后执行mingw32-make install时,提示libQVTKWidgetPlugin.dll文件复制错误,可手动修改生成目录/GUISupport/Qt/PluginInstall.cmake文件,将其中的libQVTKWidgetPlugin.dll修改为libQVTKWidgetPlugind.dll


 使用VTK

本示例程序修改自VTK-6.1.0/Examples/GUI/Qt/ImageViewer

新建Qt Widgets程序,分别将.pro文件和main.cpp文件修改为:

/* .pro文件 */
QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
TARGET = QtVTK
TEMPLATE = app

INCLUDEPATH += D:/VTK-6.1.0/MinGW/include/vtk-6.1

LIBS += -LD:/VTK-6.1.0/MinGW/lib/ \
        -lvtkGUISupportQt-6.1d \
        -lvtkIOImage-6.1d \
        -lvtkInteractionImage-6.1d \
        -lvtkRenderingCore-6.1d \
        -lvtkCommonExecutionModel-6.1d \
        -lvtkCommonCore-6.1d \
        -lvtkRenderingOpenGL-6.1d \
        -lvtkInteractionStyle-6.1d

SOURCES += main.cpp

HEADERS  +=
/* main.cpp */
#include <QApplication>

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

#include "vtkImageViewer.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkRenderer.h"
#include "vtkPNGReader.h"
#include "QVTKWidget.h"
#include "vtkImageData.h"

int main(int argc, char** argv)
{
  QApplication app(argc, argv);

  QVTKWidget widget;

  char filename[] = "D:/test.png";
  vtkPNGReader* reader = vtkPNGReader::New();
  reader->SetFileName(filename);
  reader->Update();

  vtkImageViewer* imageView = vtkImageViewer::New();
  imageView->SetInputConnection(reader->GetOutputPort());

  widget.SetRenderWindow(imageView->GetRenderWindow());
  imageView->SetupInteractor(widget.GetRenderWindow()->GetInteractor());
  imageView->SetColorLevel(138.5);
  imageView->SetColorWindow(233);

  int *dims = reader->GetOutput()->GetDimensions();
  widget.resize(dims[0], dims[1]);
  widget.show();

  app.exec();

  imageView->Delete();
  reader->Delete();
  return 0;
}

注意:
.pro文件中INCLUDEPATHLIBS设置为VTK安装后对应路径。
main.cpp文件中如果不正确设置第45、6行的模块初始化,可能会报Error: no override found for '********'错误。
如果不添加VTK_MODULE_INIT(vtkInteractionStyle),可能会在运行时产生警告,并在调试状态关闭程序时发生崩溃(segmentation fault)。

编译运行后(为能在QtCreator中直接启动程序,可能需要将VTK编译安装后的bin路径添加到系统环境变量PATH),程序将在窗口中显示程序中指定文件名对应的图片(如上面代码中的D:/test.png)。


在Qt Designer中使用VTK插件

Release模式下编译完成并执行mingw32-make install后,复制CMAKE_INSTALL_PREFIX/plugins/designer目录下的libQVTKWidgetPlugin.dllQt/Qt***/***/mingw***/plugins/designer目录(此目录应已有qaxwidget.dll等文件),打开Qt Designer(非QtCreator内的Designer,而是独立的Qt Designer)后,即可发现增加了QVTK分类,并在其下有QVTKWidget控件。
复制libQVTKWidgetPlugin.dll
QVTKWidget

注意:如需要在QtCreator内集成的Designer中使用QVTKWidget,应把libQVTKWidgetPlugin.dll复制到Qt/Qt***/Tools/QtCreator/bin/plugins/designer目录。但由于编译生成QtCreator的编译器版本与生成libQVTKWidgetPlugin.dll的版本可能并不兼容,将导致无法正常加载插件。如果无法直接使用libQVTKWidgetPlugin.dll插件,可在Designer中添加普通的QWidget控件后,手动将其提升为QVTKWidget(对应的头文件为QVTKWidget.h,注意在.pro中设置正确的INCLUDEPATH)。

参考:
1.http://www.vtk.org/Wiki/VTK/Configure_and_Build
2.http://vtk.1045678.n5.nabble.com/vtk-users-VTK-6-0-Compile-issue-with-MinGW64-on-Windows-7-x64-td5724152.html#a5726939
3.http://www.vtk.org/Wiki/VTK/VTK_6_Migration/Factories_now_require_defines
4.http://www.vtk.org/Wiki/VTK/Tutorials/QtSetup
5.http://public.kitware.com/pipermail/vtkusers/2014-July/084396.html

Qt5(MinGW)使用CMake编译与使用VTK6》上有1条评论

发表评论

电子邮件地址不会被公开。