mingw编译VTK

转载自https://zhangxc.com/2015/02/qt5-mingw-cmake-vtk6


编译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),该处原始上下文为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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,修改后上下文为:

1
2
3
4
#define IN_LIBXML
#include "libxml.h"
#undef HAVE_WIN32_THREADS
#include

启动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所在完整路径:

点击Add Entry,手动添加Qt安装目录,NameCMAKE_PREFIX_PATHTypePATHValue为Qt安装目录(应为包含qmake.exebin的父目录,可对照上下两图):

再次点击Configure

此时将弹出错误:

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文件修改为:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/* .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  +=
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
/* main.cpp */
#include
 
#include
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控件。

注意:如需要在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



你可能感兴趣的:(pcl)