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

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 <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



Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值