本帖最后由 tyzaizl 于 2016-4-28 17:10 编辑
编译支持MFC的pcl::visualization静态库文件 之前作者在论坛写过一篇《如何实现基于MFC对话框的PCL显示》的帖子,大家需求非常大。最近在为PCL中国《点云库PCL学习教程》第二版,准备可视化相关应用开发实例内容的过程中,为了方便结合MFC开发,萌生了将pcl::mfc_visulization编译成lib库文件的想法,在《如何实现基于MFC对话框的PCL显示》中讲了利用修改后的pcl::visualization模块代码进行MFC开发,今天将修改后的pcl::visualization模块编译成可以直接引用的静态链接库,将编译过程展示给大家,希望对没有接触过qt的朋友们提供方便之处。需要注意的是,为了修改后的代码稳定性肯定不如官方提供的原生代码,而且提供修改代码及编译方法是为了供大家学习使用,请勿商用。本文的内容及具体修改pcl::visualization的过程将在《点云库PCL学习教程》第二版中详细介绍,等书出版后大家可以关注。
闲话少说,进入正题,首先将编译工具版本信息列出。 表1 所需工具版本信息
工具 | | PCL-1.6.0-AllInOne-msvc2010-win32.exe | | vtk5.8 | | | http://download.qt.io/archive/qt/4.8/4.8.6/ | Visual Studio2010 | |
这里需要解释一下,需用官网all_in_one安装包的目的是为了让更多的更简单的使用作者提供的修改代码,在安装all_in_one安装包时不要安装vtk,vtk单独编译。Cmake配置vtk时,选择编译动态链接库,选Advanced,出现VTK_USE_GUISUPPORT选项,再次configure,出现VTK_USE_MFC选项如果你想使用qt,可以顺手把VTK_USE_QT选项也选上,当然前提是必须先安装qt4.x(qt5.x好像不支持vtk5.x),可以把vtk的安装路径选择在pcl/3rdparty/VTK文件内,这个随意,然后利用generate。利用VS2010编译VTK,编译过程中需要注意vtkMFC工程是默认多字符集编译的生成的,如果你希望你的工程是UNICODE的,则需要修改工程属性(可能还需要其他注意事项,但这个是必须修改的),否者你自己的工程只能选者多字符集(Use Multi-Byte Character Set)。 还有一点,作者尝试修改pcl1.8未成功,但是修改后的pcl1.6的visualization可以用在pcl1.8+vtk6.2,它相当于一个独立文件,如果用pcl1.8+pcl::mfc_visualization,所提供的修改源代码需要再进行部分修改。
编写CMakeLists.txt文件 - cmake_minimum_required(VERSION 2.8)
- project(mfc_visualization)
- set(SUBSYS_NAME mfc_visualization)
- set(SUBSYS_NAME_INC mfc_visualization_1_6)
- #查找PCL
- find_package(PCL REQUIRED)
- #设置源文件
- set(srcs
- src/point_picking_event.cpp
- src/interactor_style.cpp
- src/point_cloud_handlers.cpp
- src/pcl_visualizer.cpp
- src/histogram_visualizer.cpp
- src/common/common.cpp
- src/common/io.cpp
- src/common/shapes.cpp
- src/cloud_viewer.cpp
- src/image_viewer.cpp
- src/window.cpp
- src/range_image_visualizer.cpp
- src/common/float_image_utils.cpp
- src/vtk/pcl_image_canvas_source_2d.cpp
- )
- if("${VTK_MAJOR_VERSION}.${VTK_MINOR_VERSION}" VERSION_LESS "5.6")
- # A custom interactor is necessary on VTK 5.4 and below
- list(APPEND srcs src/interactor.cpp)
- endif("${VTK_MAJOR_VERSION}.${VTK_MINOR_VERSION}" VERSION_LESS "5.6")
- #设置头文件
- set(incs
- include/pcl/${SUBSYS_NAME_INC}/cloud_viewer.h
- include/pcl/${SUBSYS_NAME_INC}/histogram_visualizer.h
- include/pcl/${SUBSYS_NAME_INC}/image_viewer.h
- include/pcl/${SUBSYS_NAME_INC}/interactor_style.h
- include/pcl/${SUBSYS_NAME_INC}/pcl_visualizer.h
- include/pcl/${SUBSYS_NAME_INC}/registration_visualizer.h
- include/pcl/${SUBSYS_NAME_INC}/point_cloud_handlers.h
- include/pcl/${SUBSYS_NAME_INC}/keyboard_event.h
- include/pcl/${SUBSYS_NAME_INC}/point_picking_event.h
- include/pcl/${SUBSYS_NAME_INC}/mouse_event.h
- include/pcl/${SUBSYS_NAME_INC}/window.h
- include/pcl/${SUBSYS_NAME_INC}/range_image_visualizer.h
- include/pcl/${SUBSYS_NAME_INC}/interactor.h
- include/pcl/${SUBSYS_NAME_INC}/vtk.h
- )
- set(common_incs
- include/pcl/${SUBSYS_NAME_INC}/common/actor_map.h
- include/pcl/${SUBSYS_NAME_INC}/common/common.h
- include/pcl/${SUBSYS_NAME_INC}/common/io.h
- include/pcl/${SUBSYS_NAME_INC}/common/ren_win_interact_map.h
- include/pcl/${SUBSYS_NAME_INC}/common/shapes.h
- include/pcl/${SUBSYS_NAME_INC}/common/float_image_utils.h
- )
- set(impl_incs
- include/pcl/${SUBSYS_NAME_INC}/impl/histogram_visualizer.hpp
- include/pcl/${SUBSYS_NAME_INC}/impl/pcl_visualizer.hpp
- include/pcl/${SUBSYS_NAME_INC}/impl/image_viewer.hpp
- include/pcl/${SUBSYS_NAME_INC}/impl/registration_visualizer.hpp
- include/pcl/${SUBSYS_NAME_INC}/impl/point_cloud_handlers.hpp
- )
- set(common_impl_incs "include/pcl/${SUBSYS_NAME_INC}/common/impl/shapes.hpp")
- set(vtk_incs
- include/pcl/${SUBSYS_NAME_INC}/vtk/pcl_image_canvas_source_2d.h
- )
- #VTK和PCL头文件位置
- include_directories(${VTK_INCLUDE_DIRS} ${PCL_INCLUDE_DIRS})
- #VTK和PCL库文件位置
- link_directories(${VTK_LIBRARY_DIRS} ${PCL_LIBRARY_DIRS})
- #添加PCL依赖项
- add_definitions(${PCL_DEFINITIONS})
- #添加当前工程src文件位置
- include_directories("${CMAKE_CURRENT_SOURCE_DIR}/include/")
- #定义编译生成的dll文件和lib文件的位置
- set( CMAKE_RUNTIME_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin/bin )
- set( CMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG ${PROJECT_SOURCE_DIR}/bin/lib )
- #定义工程lib文件名
- set(LIB_NAME "pcl_${SUBSYS_NAME}")
- #编译生成静态lib库文件
- ADD_LIBRARY("${LIB_NAME}" STATIC ${srcs} ${incs} ${common_incs} ${impl_incs} ${common_impl_incs} ${vtk_incs})
- #ADD_EXECUTABLE("${LIB_NAME}" ${srcs} ${incs} ${common_incs} ${impl_incs} ${common_impl_incs} ${vtk_incs})
- #工程依赖的附加库文件
- if("${VTK_MAJOR_VERSION}.${VTK_MINOR_VERSION}" VERSION_LESS "5.6")
- target_link_libraries("${LIB_NAME}" pcl_common pcl_io pcl_kdtree vtkCommon vtkWidgets vtkHybrid vtkFiltering vtkRendering ${OPENGL_LIBRARIES})
- else()
- target_link_libraries("${LIB_NAME}" ${PCL_LIBRARIES} ${VTK_LIBRARIES} ${OPENGL_LIBRARIES})
- endif()
复制代码 将附件提供的压缩包文件(mfc_visualization_1_6_src(Lib).rar)下载到本地,解压得到源码,在文件夹内新建文件夹bin,打开cmake进行配置,得到vs2010工程。打开工程mfc_visualization.sln,进行编译,最终会在工程目录下得到 /lib/ pcl_mfc_visualization.lib。 利用该静态库,参照《如何实现基于MFC对话框的PCL显示》,可以完成pcl的MFC对话框可视化。利用lib库文件可以不用在编译过程中浪费时间。
附件提供了编译好的lib文件及头文件,如果大家的环境和我一样,则可以直接使用,将头文件路径和lib文件添加到工程属性中。
|