(一)将7.1.1vtk配置到MFC工程中去
毕业设计要求将CT序列图进行三维结构的重建显示,要用到VTK库,VTK和MFC进行混合编程。
说实话,这个过程很烦,首先是MFC本身就是一个即将淘汰的技术,但是由于实验室要维护一套祖传的软件(已有14年的历史。。。),被强制要求使用MFC。唉,我认为IT行业如果没有更新换代的思想,只想着吃老本,是注定要被淘汰的!
感慨完毕,进入正题。。。
假如已有MFC工程,那么怎样将VTK配置到该工程中去?(VTK安装此处略)
方法一:
用CMake管理,这个方法很简单我个人比较推荐。只需要一个.txt文档就可以将已安装好的vtk给配置到MFC工程中去。
并且CMake的历史和VTK有很大关系。
/***********************以下来自百度******************************************/
CMake是为了解决美国国家医学图书馆出资的Visible Human Project专案下的Insight Segmentation and Registration Toolkit (ITK) 软件的跨平台建构的需求而创造出来的,其设计受到了Ken Martin开发的pcmaker所影响。pcmaker当初则是为了支援Visualization
Toolkit这个开放源代码的三维图形和视觉系统才出现的,今日VTK也采用了CMake。在设计CMake之时,Kitware公司的Bill Hoffman采用了pcmaker的一些重要想法,加上更多他自己的点子,想把GNU建构系统的一些功能整合进来。CMake最初的实作是在2000年中作的,在2001年初有了急速的进展,许多改良是来自其他把CMake整合到自己的系统中的开发者,比方说,采用CMake作为建构环境的VXL社群就贡献了很多重要的功能,Brad
King为了支援CABLE和GCC-XML这套自动包装工具也加了几项功能,奇异公司的研发部门则用在内部的测试系统DART,还有一些功能是为了让VTK可以过渡到CMake和支持(“美国Los Alamos国家实验室”&“洛斯阿拉莫斯国家实验室”)的Advanced Computing Lab的平行视觉系统ParaView而加的。
/*************************************************************************/
那么为啥要用CMake?它有啥优势?
/***************以下来自yangzhenping的blog************************/
Make(或者说一个Makefile)是构建系统 - 它驱动编译器和其它构建工具来构建你的代码。
“Make”是一个工具,它控制可执行文件和程序的源文件以及程序的其他非源文件的生成。
CMake的是构建系统的生成器,CMake代表跨平台Make。它可以产生Makefile文件,它可以产生Ninja构建文件,它可以产生KDevelop或XCode的项目,它能产生Visual Studio解决方案。从同一个CMakeLists.txt文件来产生项目。如果你正在编写需要在很多不同的平台上构建的软件那么CMake的往往是一个不错的选择。
CMake优势:
◾用来写的CMakeLists.txt文件的语言是容易阅读和理解。
◾它不仅靠“Make”来构建项目。
◾它支持多个生成器像Xcode,Eclipse,Visual Studio,等等。
◾跨平台发现依赖的系统库。
◾自动发现和工具链的配置。
◾轻松地将您的文件以一个平台无关的方式编译成共享库,比make更容易使用。
反正个人理解就是别人用其他语言写的一些库,程序什么的,我用另外的一个语言也想用,或者用另一个IDE或者编译器也想用,那么CMake就可以将它转化过来,便于管理共享。并且在一些文件改变时,它也可以简化工作。
好,该怎样用呢?
我们只需要编写CMakeLists.txt文件就ok。
我拿我的来举例吧。(实际上我也是从《VTK图形图像进阶》学的)
#**********************************************************************
#
# Copyright (c) 张晓东, 罗火灵. All rights reserved.
# 更多信息请访问:
# http://www.vtkchina.org (VTK中国)
# http://blog.****.net/www_doling_net (东灵工作室)
#
#**********************************************************************
CMAKE_MINIMUM_REQUIRED( VERSION 2.8 )
PROJECT( vtkSDI )
#----------------------------------------------------------------------------------
# 查找并包含VTK工具包
FIND_PACKAGE( VTK )
IF (VTK_FOUND)
INCLUDE (${VTK_USE_FILE})
ELSE (VTK_FOUND)
MESSAGE (FATAL_ERROR "Cannot build without VTK. Please set VTK_DIR")
ENDIF( VTK_FOUND )
#----------------------------------------------------------------------------------
# 这里添加本工程的文件
# 主要分为两部分:
# 一是新建的单文档程序中的非工程文件
# 二是用户后续添加的类文件
SET( PROJECT_SRCS
MainFrm.h
MainFrm.cpp
stdafx.h
stdafx.cpp
ChooseColorDlg.h
ChooseColorDlg.cpp
Image_Processing.h
Image_Processing.cpp
Image_ProcessingDoc.h
Image_ProcessingDoc.cpp
Image_ProcessingView.h
Image_ProcessingView.cpp
MFCListCtrlEx.h
MFCListCtrlEx.cpp
mHistogram.h
mHistogram.cpp
MyImage_.h
MyImage_.cpp
MySeries_.h
MySeries_.cpp
OstuChildDlg.h
OstuChildDlg.cpp
OstuSegDlg.h
OstuSegDlg.cpp
PicPreview.h
PicPreview.cpp
ResutionCtrl.h
ResutionCtrl.cpp
targetver.h
Resource.h
Image_Processing.rc
res/Image_Processing.rc2
res/Image_Processing.ico
res/Image_ProcessingDoc.ico
res/Toolbar.bmp
res/Toolbar256.bmp
res/toolbar1.bmp
)
#----------------------------------------------------------------------------------
# 设置工程包含的vtk模块,这里根据需要加载对应的模块
INCLUDE("F:/VTK/VTK-7.1.1-MFCbin/GUISupport/MFC/VTKMFCSettings.cmake")
SET( VTK_LIBS ${vtk_libraries}
vtkGUISupportMFC
vtkIO
vtkRendering
vtkGraphics
vtkHybrid
vtkFiltering
vtkCommon
vtkImaging
)
IF(VTK_MFC_DELAYLOAD_VTK_DLLS)
VTK_MFC_ADD_DELAYLOAD_FLAGS(CMAKE_EXE_LINKER_FLAGS
vtkMFC.dll
vtkIO.dll
vtkRendering.dll
vtkGraphics.dll
vtkHybrid.dll
vtkFiltering.dll
vtkCommon.dll
vtkImaging.dll
)
ENDIF(VTK_MFC_DELAYLOAD_VTK_DLLS)
#----------------------------------------------------------------------------------
ADD_EXECUTABLE( Image_Processing WIN32 ${PROJECT_SRCS} )
TARGET_LINK_LIBRARIES ( Image_Processing
${VTK_LIBS} )
#-----------------------------------------------------------------------------------
# Construct a list of paths containing runtime directories for project applications on Windows.
# Create two batch files which correctly set up the environment for the application and for Visual Studio.
红色部分,加$的基本都是路径,这些实际上应该在安装VTK时已经配置好了的,比如。
这里VTK-7.1.1-src是源码,bin是编译好生成的VS工程,debug和release分别是生成的lib include dll等。
之后在环境变量里设置:
浅蓝色部分就是,我们MFC工程的源码和图标bmp资源等,这里我们将CMakeLists.txt放在工程源文件里。
SET( PROJECT_SRCS .........)此句就是这个作用。
紫色部分就是,所需要的VTK模块,值得注意的是,由于我们要用MFC所以要
INCLUDE("F:/VTK/VTK-7.1.1-MFCbin/GUISupport/MFC/VTKMFCSettings.cmake")
即将编译好的VTK的这个cmake文件包含进来,同理
我们要用Qt的话,同样要把它包含进来。
紫色模块同样也要注意和VTK版本对应起来。这里我们用的VTK是7.1.1版本,他的MFC模块不是vtkMFC,而变成了
vtkGUISupportMFC
这里要注意。
之后的IF(VTK_MFC_DELAYLOAD_VTK_DLLS)
VTK_MFC_ADD_DELAYLOAD_FLAGS(CMAKE_EXE_LINKER_FLAGS
vtkMFC.dll
vtkIO.dll
vtkRendering.dll
vtkGraphics.dll
vtkHybrid.dll
vtkFiltering.dll
vtkCommon.dll
vtkImaging.dll
)
ENDIF(VTK_MFC_DELAYLOAD_VTK_DLLS)
是延迟加载dll,如果MFC的dll先于VTK的dll加载进去的话,就会出现内存泄露问题。这几句不写也可以,在VS项目属性中也可以修改。
ADD_EXECUTABLE( Image_Processing WIN32 ${PROJECT_SRCS} )这一句也要加上,否则在debug时会有问题。
Image_Processing是debug生成后exe的名字。
好,CMakeLists.txt写好了。接下来就用CMake就行了。src就选txt所在目录,输出就选工程的目录即可。
对了,在CMake之前,首先要将原本VS工程的.sln .ncb .user .vcproj等文件删除,因为这是工程项目的输出文件,CMake之后会重新生成的。
然后用CMake之后,就得到了项目。
至此,已完成配置。我们运行一下试试。
可以运行。
在我自己做的时候,出现无法打开vtkIO.dll 等错误。
发生这个错误还是vtk版本的问题。
解决办法是进入项目属性,将附加依赖项的库修改成你所用的.lib就ok了
这样问题就解决了。
方法二:通用的配置方法,不用CMake。(以后更新。。。。)