(一)将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更容易使用。

/********************http://blog.****.net/yangzhenping/article/details/50667774********************************/


反正个人理解就是别人用其他语言写的一些库,程序什么的,我用另外的一个语言也想用,或者用另一个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时已经配置好了的,比如。

(一)将7.1.1vtk配置到MFC工程中去

这里VTK-7.1.1-src是源码,bin是编译好生成的VS工程,debug和release分别是生成的lib include dll等。

之后在环境变量里设置:

(一)将7.1.1vtk配置到MFC工程中去

浅蓝色部分就是,我们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之后,就得到了项目。

(一)将7.1.1vtk配置到MFC工程中去

至此,已完成配置。我们运行一下试试。

(一)将7.1.1vtk配置到MFC工程中去

可以运行。

在我自己做的时候,出现无法打开vtkIO.dll  等错误。

发生这个错误还是vtk版本的问题。

解决办法是进入项目属性,将附加依赖项的库修改成你所用的.lib就ok了

(一)将7.1.1vtk配置到MFC工程中去

(一)将7.1.1vtk配置到MFC工程中去

这样问题就解决了。


方法二:通用的配置方法,不用CMake。(以后更新。。。。)