计算机系统:Win8.1(64 bit)
ITK版本:4.7.2
Cmake版本:3.1.0
编译器:MSVC 2012(64 bit)
Qt Creator:3.0.1(64 bit)
Qt版本:5.2.1(64 bit)
1 目标
使用VS2012编译ITK-4.7.2,使其能和VTK结合,并且支持python语言,并且能够在Qt开发环境中进行开发。
2 配置
参考资料[2]对ITK的编译已经做了很好的说明,再此不赘言。这里仅仅贴出配置过程中主要的选项设置:
2.1 一般配置
BUILD_SHARED_LIBS [ON] BUILD_EXAMPLES [ON] BUILD_TEST [ON] CMAKE_INSTALL_PREFIX [ITK的安装目录] ITKV3_COMPATIBILITY [ON] Module_ITKVtkGlue [ON] VTK_DIR [VTK库目录(例如E:/VTK/VTK-6.2.0_install/lib/cmake/vtk-6.2)] Module_ITKReview [ON]说明:如果不启动Module_ITKReview,则编译安装后不支持LabelGeometryImageFilter。
2.2 支持Python
ITK_WRAP_PYTHON [ON] ITK_LEGACY_SLIENT [ON]
说明:根据参考资料[2]的说明,支持Python时要开启ITK_WRAP_PYTHON选项。另外,在配置过程中提示要开启ITK_LEGACY_SLIENT选项。
注意:开启Python支持有可能导致下面的编译失败,如果不是及其想要这个特性,建议去掉。
3 编译
在编译的过程中,如果联网,则会下载一些文件,例如:
Performing download step (download, verify and extract) for 'GCC_XML' 1> -- downloading... 1> src='http://itk.org/files/gccxml/gccxml-2014-08-06.tar.bz2' 1> dst='E:/ITK/InsightToolkit-4.7.2_build/Wrapping/Generators/GccXML/gccxml/src/gccxml-2014-08-06.tar.bz2'如果网络不通,将会出错:
1>CUSTOMBUILD : error : downloading 'http://itk.org/files/gccxml/gccxml-2014-08-06.tar.bz2' 1> failed
说明:1) 上述提示是开启了Python支持的情况,如果没有支持Python,是没有上述的下载过程的。
2) 如果开始了Python支持,本文的测试暂时是失败的,关闭Python支持,编译可以成功。
4 测试
使用Visual Studio 2012创建一个简单的ITK工程,利用上面编译好的库进行测试可以成功。但是使用Qt Creator(配置的编译器是MSVC2012)创建ITK工程以进行测试时,提示错误:
itksys-4.7.lib(SystemTools.obj):-1: error: LNK2019: 无法解析的外部符号 __imp_RegCloseKey,该符号在函数 "public: static bool __cdecl itksys::SystemTools::GetRegistrySubKeys(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &,class std::vector<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >,class std::allocator<class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > > > &,enum itksys::SystemTools::KeyWOW64)" (?GetRegistrySubKeys@SystemTools@itksys@@SA_NAEBV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@AEAV?$vector@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@V?$allocator@V?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@2@@4@W4KeyWOW64@12@@Z) 中被引用
4.1 错误原因
根据参考资料[6][7]的提示,这是因为没有链接到advapi32.lib。其实,仔细看Cmake配置时发现,有个项目CMAKE_C_STANDARD_LIBRARIES,其内容为:
kernel32.lib user32.lib gdi32.lib winspool.lib shell32.lib ole32.lib oleaut32.lib uuid.lib comdlg32.lib advapi32.lib
当使用Visual Studio 2012对ITK项目进行编译时,会自动链接到上面的库,但是当使用Qt Creator时,情况不一样,需要手动指定上述的库名和路径。经过查找发现,上述的库文件都在目录C:\Program Files (x86)\Windows Kits\8.0\Lib\win8\um\x64中。
4.2 解决方法
经过测试发现,其实只要指定AdvAPI32.Lib和shell32.lib两个库及其目录就可以解决上述的问题,.pro的库配置如下:
INCLUDEPATH += E:/ITK/InsightToolkit-4.7.2_install/include/ITK-4.7 QMAKE_LIBDIR += E:/ITK/InsightToolkit-4.7.2_install/lib\ C:/Program Files (x86)/Windows Kits/8.0/Lib/win8/um/x64 LIBS += shell32.lib\ AdvAPI32.Lib LIBS += ITKBiasCorrection-4.7.lib\ ITKBioCell-4.7.lib\ ITKCommon-4.7.lib\ ITKDeprecated-4.7.lib\ ITKDICOMParser-4.7.lib\ itkdouble-conversion-4.7.lib\ ITKEXPAT-4.7.lib\ ITKFEM-4.7.lib\ itkgdcmCommon-4.7.lib\ itkgdcmDICT-4.7.lib\ itkgdcmDSED-4.7.lib\ itkgdcmIOD-4.7.lib\ itkgdcmjpeg12-4.7.lib\ itkgdcmjpeg16-4.7.lib\ itkgdcmjpeg8-4.7.lib\ itkgdcmMSFF-4.7.lib\ ITKgiftiio-4.7.lib\ itkhdf5-4.7.lib\ itkhdf5_cpp-4.7.lib\ ITKIOBioRad-4.7.lib\ ITKIOBMP-4.7.lib\ ITKIOCSV-4.7.lib\ ITKIOGDCM-4.7.lib\ ITKIOGE-4.7.lib\ ITKIOGIPL-4.7.lib\ ITKIOHDF5-4.7.lib\ ITKIOImageBase-4.7.lib\ ITKIOIPL-4.7.lib\ ITKIOJPEG-4.7.lib\ ITKIOLSM-4.7.lib\ ITKIOMesh-4.7.lib\ ITKIOMeta-4.7.lib\ ITKIOMRC-4.7.lib\ ITKIONIFTI-4.7.lib\ ITKIONRRD-4.7.lib\ ITKIOPNG-4.7.lib\ ITKIOSiemens-4.7.lib\ ITKIOSpatialObjects-4.7.lib\ ITKIOStimulate-4.7.lib\ ITKIOTIFF-4.7.lib\ ITKIOTransformBase-4.7.lib\ ITKIOTransformHDF5-4.7.lib\ ITKIOTransformInsightLegacy-4.7.lib\ ITKIOTransformMatlab-4.7.lib\ ITKIOVTK-4.7.lib\ ITKIOXML-4.7.lib\ itkjpeg-4.7.lib\ ITKKLMRegionGrowing-4.7.lib\ ITKLabelMap-4.7.lib\ ITKMesh-4.7.lib\ ITKMetaIO-4.7.lib\ itkNetlibSlatec-4.7.lib\ ITKniftiio-4.7.lib\ ITKNrrdIO-4.7.lib\ itkopenjpeg-4.7.lib\ ITKOptimizers-4.7.lib\ ITKOptimizersv4-4.7.lib\ ITKPath-4.7.lib\ itkpng-4.7.lib\ ITKPolynomials-4.7.lib\ ITKQuadEdgeMesh-4.7.lib\ ITKSpatialObjects-4.7.lib\ ITKStatistics-4.7.lib\ itksys-4.7.lib\ itktiff-4.7.lib\ itkv3p_lsqr-4.7.lib\ itkv3p_netlib-4.7.lib\ itkvcl-4.7.lib\ ITKVideoCore-4.7.lib\ ITKVideoIO-4.7.lib\ itkvnl-4.7.lib\ ITKVNLInstantiation-4.7.lib\ itkvnl_algo-4.7.lib\ ITKVTK-4.7.lib\ ITKVtkGlue-4.7.lib\ ITKWatersheds-4.7.lib\ itkzlib-4.7.lib\ ITKznz-4.7.lib
5 总结
对比《VS2012编译安装VTK-6.2.0_支持Qt5.2.1》可以发现,与VTK的配置不同的是,在使用CMake配置阶段,并没有专门针对Qt的配置。ITK关于Qt的支持,是不用经过特别配置的,只是在编译项目时,需要指定所依赖的系统库。
参考资料
[1]win7 64位下VS2010/VS2012 下安装 ITK/VTK(一)
[2]ITK在vs2010下安装、搭建
[3]ITK进行日志-2
[4]ITK在VS2010中的安装和第一个例子
[5]ITK+VTK+Python的整合及例子程序
[6]VC2008编译问题,如何设置
[7]error: LNK1120: 5 unresolved externals
[8]__imp__CommandLineToArgvW