QT配置PCL过程记录(一)

因为自己最近要用到Qt和PCL,所以就在网上搜集了一下资料,经过一天的折腾,总算是将PCL装上并且在Qt上配置成功。过程总的来说还是有些艰难的,毕竟我之前没用过Qt,不了解Qt的机制,只能靠自己看一些书和网上的教程才得以没走太多的弯路。不过这中间也是碰到了一些问题,正好在这记录一下。

文章目录

  • 一、准备工作:软件的下载
  • 二、安装pcl1.8.1注意事项
  • 三、Qt配置PCL
  • 四、VTK8.0.0重新编译(使用cmake工具)
  • 五、VTK文件重新配置
  • 六、程序测试
  • 七、小结

一、准备工作:软件的下载

我们所需要的软件主要有一下几个:

1、 VS2015:这就不用怎么介绍了,使用很广泛的一个软件,到网上搜一搜就有一大堆安装教程。
2、 Qt5.9.4:Qt虽然说没有VS那么普遍,但是其功能的强大是毋庸置疑的,我用的版本是5.9.4,我也推荐对于要学习Qt的同学尽量安装Qt的5.9系列,因为Qt5.9版本是一个长期支持的版本(long term supported,LTS),在未来的一段时间内会持续更新。当然了,最新版本的Qt肯定也是不错的选择,这就要看个人的需求了。
下载地址:http://download.qt.io/archive/qt/
3、 PCL1.8.1:一个处理点云的第三方库,其拥有这强大的三维显示功能,我也是刚接触只知道这么多了。
下载地址:https://github.com/PointCloudLibrary/pcl/releases/tag/pcl-1.8.1
4、 cmake:是一种跨平台的编译工具,它可以应用于Windows、Linux等系统,也是刚接触也就知道这么多了哈哈。下载地址:https://cmake.org/download/
5、VTK8.0.0:VTK是一个开源的软件系统,它在图像处理、三维可视化等方面有这很广泛的应用。
下载地址:https://gitlab.kitware.com/vtk/vtk/tree/v8.0.0
至此我们所需要的所有软件都已经罗列完毕,在这要特意说明一下,因为我的系统是64位Windows10系统,所以上述的软件都是64位Windows软件。话不多说,接下来就开始安装软件。

二、安装pcl1.8.1注意事项

VS和QT的安装教程网上有很多,随便找一个把软件装上就可以了。安装pcl1.8.1的安装过程一定要注意下面几点:
1、安装过程中不要忘记将PCL的安装目录添加到系统变量中去。
QT配置PCL过程记录(一)_第1张图片
2、安装的路径中尽量不要有空格,据说这是因为Qt会把空格两边的字符串分开看成两个字符串,这就会使得之后为Qt添加PCL的头文件是造成麻烦。
QT配置PCL过程记录(一)_第2张图片
如果你已经安装好了,那只要把安装路径中的PCL 1.8.1中间的空格删掉就行了。
QT配置PCL过程记录(一)_第3张图片
我当时虽然按照网上的说明删掉了pcl 1.8.1中的空格,但是没想到Pragram Files中间也有空格,害得我只能在重新找了一个路径重装了一下软件,这浪费了我几个小时的时间啊,坑人。

3、安装过程中会出现让我们安装OpenNI2的界面,尽量把其安装路径放到…\PCL1.8.1\3rdParty\OpenNI2中,方便之后的使用和管理。
4、安装完成之后,手动添加系统变量
QT配置PCL过程记录(一)_第4张图片

三、Qt配置PCL

接下来终于到了我们的重头戏了,就是把pcl中的头文件和库文件添加到Qt的项目中去,步骤如下:
1、新建一个Qt控制台程序,如下所示:
QT配置PCL过程记录(一)_第5张图片2、为了考虑到我日后使用PCL的方便,所以我就按照网上的教程建立个.pri文件,这个文件有点像VS中的.props文件(属性表文件),如下所示:
(1)新建一个.txt文件,取名pcl,将.txt后缀改为.pri。
(2)用记事本打开pcl.prj文件,向其中添加pcl的头文件和库文件路径,如下所示:
QT配置PCL过程记录(一)_第6张图片
添加路径如下:

INCLUDEPATH += C:\PCL\PCL1.8.1\include\pcl-1.8

INCLUDEPATH += C:\PCL\PCL1.8.1\include\pcl-1.8\pcl

INCLUDEPATH += C:\PCL\PCL1.8.1\3rdParty\Boost\include\boost-1_64

INCLUDEPATH += C:\PCL\PCL1.8.1\3rdParty\Boost\include\boost-1_64\boost

INCLUDEPATH += C:\PCL\PCL1.8.1\3rdParty\Eigen\eigen3

INCLUDEPATH += C:\PCL\PCL1.8.1\3rdParty\FLANN\include

INCLUDEPATH += C:\PCL\PCL1.8.1\3rdParty\FLANN\include\flann

INCLUDEPATH += C:\PCL\PCL1.8.1\3rdParty\OpenNI2\Include

INCLUDEPATH += C:\PCL\PCL1.8.1\3rdParty\Qhull\include

INCLUDEPATH += C:\PCL\PCL1.8.1\3rdParty\VTK\include\vtk-8.0

CONFIG(debug,debug|release){
     
LIBS += -LC:\PCL\PCL1.8.1\lib\
        -lpcl_common_debug\
        -lpcl_features_debug\
        -lpcl_filters_debug\
        -lpcl_io_debug\
        -lpcl_io_ply_debug\
        -lpcl_kdtree_debug\
        -lpcl_keypoints_debug\
        -lpcl_ml_debug\
        -lpcl_octree_debug\
        -lpcl_outofcore_debug\
        -lpcl_people_debug\
        -lpcl_recognition_debug\
        -lpcl_registration_debug\
        -lpcl_sample_consensus_debug\
        -lpcl_search_debug\
        -lpcl_segmentation_debug\
        -lpcl_stereo_debug\
        -lpcl_surface_debug\
        -lpcl_tracking_debug\
        -lpcl_visualization_debug

LIBS += -LC:\PCL\PCL1.8.1\3rdParty\Boost\lib\
        -llibboost_atomic-vc140-mt-gd-1_64\
        -llibboost_bzip2-vc140-mt-gd-1_64\
        -llibboost_chrono-vc140-mt-gd-1_64\
        -llibboost_container-vc140-mt-gd-1_64\
        -llibboost_context-vc140-mt-gd-1_64\
        -llibboost_coroutine-vc140-mt-gd-1_64\
        -llibboost_date_time-vc140-mt-gd-1_64\
        -llibboost_exception-vc140-mt-gd-1_64\
        -llibboost_fiber-vc140-mt-gd-1_64\
        -llibboost_filesystem-vc140-mt-gd-1_64\
        -llibboost_graph-vc140-mt-gd-1_64\
        -llibboost_graph_parallel-vc140-mt-gd-1_64\
        -llibboost_iostreams-vc140-mt-gd-1_64\
        -llibboost_locale-vc140-mt-gd-1_64\
        -llibboost_log-vc140-mt-gd-1_64\
        -llibboost_log_setup-vc140-mt-gd-1_64\
        -llibboost_math_c99-vc140-mt-gd-1_64\
        -llibboost_math_c99f-vc140-mt-gd-1_64\
        -llibboost_math_c99l-vc140-mt-gd-1_64\
        -llibboost_math_tr1-vc140-mt-gd-1_64\
        -llibboost_math_tr1f-vc140-mt-gd-1_64\
        -llibboost_math_tr1l-vc140-mt-gd-1_64\
        -llibboost_mpi-vc140-mt-gd-1_64\
        -llibboost_numpy-vc140-mt-gd-1_64\
        -llibboost_numpy3-vc140-mt-gd-1_64\
        -llibboost_prg_exec_monitor-vc140-mt-gd-1_64\
        -llibboost_program_options-vc140-mt-gd-1_64\
        -llibboost_python-vc140-mt-gd-1_64\
        -llibboost_python3-vc140-mt-gd-1_64\
        -llibboost_random-vc140-mt-gd-1_64\
        -llibboost_regex-vc140-mt-gd-1_64\
        -llibboost_serialization-vc140-mt-gd-1_64\
        -llibboost_signals-vc140-mt-gd-1_64\
        -llibboost_system-vc140-mt-gd-1_64\
        -llibboost_test_exec_monitor-vc140-mt-gd-1_64\
        -llibboost_thread-vc140-mt-gd-1_64\
        -llibboost_timer-vc140-mt-gd-1_64\
        -llibboost_type_erasure-vc140-mt-gd-1_64\
        -llibboost_unit_test_framework-vc140-mt-gd-1_64\
        -llibboost_wave-vc140-mt-gd-1_64\
        -llibboost_wserialization-vc140-mt-gd-1_64\
        -llibboost_zlib-vc140-mt-gd-1_64

LIBS += -LC:\PCL\PCL1.8.1\3rdParty\FLANN\lib\
        -lflann-gd\
        -lflann_cpp-gd\
        -lflann_cpp_s-gd\
        -lflann_s-gd

LIBS += -LC:\PCL\PCL1.8.1\3rdParty\OpenNI2\Lib\
        -lOpenNI2

LIBS += -LC:\PCL\PCL1.8.1\3rdParty\Qhull\lib\
        -lqhull_d\
        -lqhullcpp_d\
        -lqhullstatic_d\
        -lqhullstatic_r_d\
        -lqhull_p_d\
        -lqhull_r_d

LIBS += -LC:\Qt\Qt5.9.4\5.9.4\msvc2015_64\lib\
        -lQt5OpenGL

LIBS += -LC:\PCL\PCL1.8.1\3rdParty\VTK\lib\
        -lvtkalglib-8.0-gd\
        -lvtkChartsCore-8.0-gd\
        -lvtkCommonColor-8.0-gd\
        -lvtkCommonComputationalGeometry-8.0-gd\
        -lvtkCommonCore-8.0-gd\
        -lvtkCommonDataModel-8.0-gd\
        -lvtkCommonExecutionModel-8.0-gd\
        -lvtkCommonMath-8.0-gd\
        -lvtkCommonMisc-8.0-gd\
        -lvtkCommonSystem-8.0-gd\
        -lvtkCommonTransforms-8.0-gd\
        -lvtkDICOMParser-8.0-gd\
        -lvtkDomainsChemistry-8.0-gd\
        -lvtkexoIIc-8.0-gd\
        -lvtkexpat-8.0-gd\
        -lvtkFiltersAMR-8.0-gd\
        -lvtkFiltersCore-8.0-gd\
        -lvtkFiltersExtraction-8.0-gd\
        -lvtkFiltersFlowPaths-8.0-gd\
        -lvtkFiltersGeneral-8.0-gd\
        -lvtkFiltersGeneric-8.0-gd\
        -lvtkFiltersGeometry-8.0-gd\
        -lvtkFiltersHybrid-8.0-gd\
        -lvtkFiltersHyperTree-8.0-gd\
        -lvtkFiltersImaging-8.0-gd\
        -lvtkFiltersModeling-8.0-gd\
        -lvtkFiltersParallel-8.0-gd\
        -lvtkFiltersParallelImaging-8.0-gd\
        -lvtkFiltersPoints-8.0-gd\
        -lvtkFiltersProgrammable-8.0-gd\
        -lvtkFiltersSelection-8.0-gd\
        -lvtkFiltersSMP-8.0-gd\
        -lvtkFiltersSources-8.0-gd\
        -lvtkFiltersStatistics-8.0-gd\
        -lvtkFiltersTexture-8.0-gd\
        -lvtkFiltersTopology-8.0-gd\
        -lvtkFiltersVerdict-8.0-gd\
        -lvtkfreetype-8.0-gd\
        -lvtkGeovisCore-8.0-gd\
        -lvtkgl2ps-8.0-gd\
        -lvtkGUISupportQt-8.0-gd\
        -lvtkGUISupportQtOpenGL-8.0-gd\
        -lvtkGUISupportQtSQL-8.0-gd\
        -lvtkhdf5-8.0-gd\
        -lvtkhdf5_hl-8.0-gd\
        -lvtkImagingColor-8.0-gd\
        -lvtkImagingCore-8.0-gd\
        -lvtkImagingFourier-8.0-gd\
        -lvtkImagingGeneral-8.0-gd\
        -lvtkImagingHybrid-8.0-gd\
        -lvtkImagingMath-8.0-gd\
        -lvtkImagingMorphological-8.0-gd\
        -lvtkImagingSources-8.0-gd\
        -lvtkImagingStatistics-8.0-gd\
        -lvtkImagingStencil-8.0-gd\
        -lvtkInfovisCore-8.0-gd\
        -lvtkInfovisLayout-8.0-gd\
        -lvtkInteractionImage-8.0-gd\
        -lvtkInteractionStyle-8.0-gd\
        -lvtkInteractionWidgets-8.0-gd\
        -lvtkIOAMR-8.0-gd\
        -lvtkIOCore-8.0-gd\
        -lvtkIOEnSight-8.0-gd\
        -lvtkIOExodus-8.0-gd\
        -lvtkIOExport-8.0-gd\
        -lvtkIOExportOpenGL-8.0-gd\
        -lvtkIOGeometry-8.0-gd\
        -lvtkIOImage-8.0-gd\
        -lvtkIOImport-8.0-gd\
        -lvtkIOInfovis-8.0-gd\
        -lvtkIOLegacy-8.0-gd\
        -lvtkIOLSDyna-8.0-gd\
        -lvtkIOMINC-8.0-gd\
        -lvtkIOMovie-8.0-gd\
        -lvtkIONetCDF-8.0-gd\
        -lvtkIOParallel-8.0-gd\
        -lvtkIOParallelXML-8.0-gd\
        -lvtkIOPLY-8.0-gd\
        -lvtkIOSQL-8.0-gd\
        -lvtkIOTecplotTable-8.0-gd\
        -lvtkIOVideo-8.0-gd\
        -lvtkIOXML-8.0-gd\
        -lvtkIOXMLParser-8.0-gd\
        -lvtkjpeg-8.0-gd\
        -lvtkjsoncpp-8.0-gd\
        -lvtklibharu-8.0-gd\
        -lvtklibxml2-8.0-gd\
        -lvtklz4-8.0-gd\
        -lvtkmetaio-8.0-gd\
        -lvtkNetCDF-8.0-gd\
        -lvtknetcdf_c++-gd\
        -lvtkoggtheora-8.0-gd\
        -lvtkParallelCore-8.0-gd\
        -lvtkpng-8.0-gd\
        -lvtkproj4-8.0-gd\
        -lvtkRenderingAnnotation-8.0-gd\
        -lvtkRenderingContext2D-8.0-gd\
        -lvtkRenderingContextOpenGL-8.0-gd\
        -lvtkRenderingCore-8.0-gd\
        -lvtkRenderingFreeType-8.0-gd\
        -lvtkRenderingGL2PS-8.0-gd\
        -lvtkRenderingImage-8.0-gd\
        -lvtkRenderingLabel-8.0-gd\
        -lvtkRenderingLIC-8.0-gd\
        -lvtkRenderingLOD-8.0-gd\
        -lvtkRenderingOpenGL-8.0-gd\
#        -lvtkRenderingQt-8.0-gd\			
        -lvtkRenderingVolume-8.0-gd\
        -lvtkRenderingVolumeOpenGL-8.0-gd\
        -lvtksqlite-8.0-gd\
        -lvtksys-8.0-gd\
        -lvtktiff-8.0-gd\
        -lvtkverdict-8.0-gd\
        -lvtkViewsContext2D-8.0-gd\
        -lvtkViewsCore-8.0-gd\
        -lvtkViewsInfovis-8.0-gd\
#        -lvtkViewsQt-8.0-gd\
        -lvtkzlib-8.0-gd
} else {
     
LIBS += -LC:\PCL\PCL1.8.1\lib\
        -lpcl_common_release\
        -lpcl_features_release\
        -lpcl_filters_release\
        -lpcl_io_ply_release\
        -lpcl_io_release\
        -lpcl_kdtree_release\
        -lpcl_keypoints_release\
        -lpcl_ml_release\
        -lpcl_octree_release\
        -lpcl_outofcore_release\
        -lpcl_people_release\
        -lpcl_recognition_release\
        -lpcl_registration_release\
        -lpcl_sample_consensus_release\
        -lpcl_search_release\
        -lpcl_segmentation_release\
        -lpcl_stereo_release\
        -lpcl_surface_release\
        -lpcl_tracking_release\
        -lpcl_visualization_release

LIBS += -LC:\PCL\PCL1.8.1\3rdParty\Boost\lib\
        -llibboost_atomic-vc140-mt-1_64\
        -llibboost_bzip2-vc140-mt-1_64\
        -llibboost_chrono-vc140-mt-1_64\
        -llibboost_container-vc140-mt-1_64\
        -llibboost_context-vc140-mt-1_64\
        -llibboost_coroutine-vc140-mt-1_64\
        -llibboost_date_time-vc140-mt-1_64\
        -llibboost_exception-vc140-mt-1_64\
        -llibboost_fiber-vc140-mt-1_64\
        -llibboost_filesystem-vc140-mt-1_64\
        -llibboost_graph-vc140-mt-1_64\
        -llibboost_graph_parallel-vc140-mt-1_64\
        -llibboost_iostreams-vc140-mt-1_64\
        -llibboost_locale-vc140-mt-1_64\
        -llibboost_log-vc140-mt-1_64\
        -llibboost_log_setup-vc140-mt-1_64\
        -llibboost_math_c99-vc140-mt-1_64\
        -llibboost_math_c99f-vc140-mt-1_64\
        -llibboost_math_c99l-vc140-mt-1_64\
        -llibboost_math_tr1-vc140-mt-1_64\
        -llibboost_math_tr1f-vc140-mt-1_64\
        -llibboost_math_tr1l-vc140-mt-1_64\
        -llibboost_mpi-vc140-mt-1_64\
        -llibboost_numpy-vc140-mt-1_64\
        -llibboost_numpy3-vc140-mt-1_64\
        -llibboost_prg_exec_monitor-vc140-mt-1_64\
        -llibboost_program_options-vc140-mt-1_64\
        -llibboost_python-vc140-mt-1_64\
        -llibboost_python3-vc140-mt-1_64\
        -llibboost_random-vc140-mt-1_64\
        -llibboost_regex-vc140-mt-1_64\
        -llibboost_serialization-vc140-mt-1_64\
        -llibboost_signals-vc140-mt-1_64\
        -llibboost_system-vc140-mt-1_64\
        -llibboost_test_exec_monitor-vc140-mt-1_64\
        -llibboost_thread-vc140-mt-1_64\
        -llibboost_timer-vc140-mt-1_64\
        -llibboost_type_erasure-vc140-mt-1_64\
        -llibboost_unit_test_framework-vc140-mt-1_64\
        -llibboost_wave-vc140-mt-1_64\
        -llibboost_wserialization-vc140-mt-1_64\
        -llibboost_zlib-vc140-mt-1_64

LIBS += -LC:\PCL\PCL1.8.1\3rdParty\FLANN\lib\
        -lflann\
        -lflann_cpp\
        -lflann_cpp_s\
        -lflann_s

LIBS += -LC:\PCL\PCL1.8.1\3rdParty\OpenNI2\Lib\
        -lOpenNI2

LIBS += -LC:\PCL\PCL1.8.1\3rdParty\Qhull\lib\
        -lqhull\
        -lqhullcpp\
        -lqhullstatic\
        -lqhullstatic_r\
        -lqhull_p\
        -lqhull_r

LIBS += -LC:\PCL\PCL1.8.1\3rdParty\VTK\lib\
        -lvtkalglib-8.0\
        -lvtkChartsCore-8.0\
        -lvtkCommonColor-8.0\
        -lvtkCommonComputationalGeometry-8.0\
        -lvtkCommonCore-8.0\
        -lvtkCommonDataModel-8.0\
        -lvtkCommonExecutionModel-8.0\
        -lvtkCommonMath-8.0\
        -lvtkCommonMisc-8.0\
        -lvtkCommonSystem-8.0\
        -lvtkCommonTransforms-8.0\
        -lvtkDICOMParser-8.0\
        -lvtkDomainsChemistry-8.0\
        -lvtkDomainsChemistryOpenGL2-8.0\
        -lvtkexoIIc-8.0\
        -lvtkexpat-8.0\
        -lvtkFiltersAMR-8.0\
        -lvtkFiltersCore-8.0\
        -lvtkFiltersExtraction-8.0\
        -lvtkFiltersFlowPaths-8.0\
        -lvtkFiltersGeneral-8.0\
        -lvtkFiltersGeneric-8.0\
        -lvtkFiltersGeometry-8.0\
        -lvtkFiltersHybrid-8.0\
        -lvtkFiltersHyperTree-8.0\
        -lvtkFiltersImaging-8.0\
        -lvtkFiltersModeling-8.0\
        -lvtkFiltersParallel-8.0\
        -lvtkFiltersParallelImaging-8.0\
        -lvtkFiltersProgrammable-8.0\
        -lvtkFiltersSelection-8.0\
        -lvtkFiltersSMP-8.0\
        -lvtkFiltersSources-8.0\
        -lvtkFiltersStatistics-8.0\
        -lvtkFiltersTexture-8.0\
        -lvtkFiltersVerdict-8.0\
        -lvtkfreetype-8.0\
        -lvtkGeovisCore-8.0\
        -lvtkglew-8.0\
        -lvtkGUISupportQt-8.0\
        -lvtkGUISupportQtSQL-8.0\
        -lvtkhdf5-8.0\
        -lvtkhdf5_hl-8.0\
        -lvtkImagingColor-8.0\
        -lvtkImagingCore-8.0\
        -lvtkImagingFourier-8.0\
        -lvtkImagingGeneral-8.0\
        -lvtkImagingHybrid-8.0\
        -lvtkImagingMath-8.0\
        -lvtkImagingMorphological-8.0\
        -lvtkImagingSources-8.0\
        -lvtkImagingStatistics-8.0\
        -lvtkImagingStencil-8.0\
        -lvtkInfovisCore-8.0\
        -lvtkInfovisLayout-8.0\
        -lvtkInteractionImage-8.0\
        -lvtkInteractionStyle-8.0\
        -lvtkInteractionWidgets-8.0\
        -lvtkIOAMR-8.0\
        -lvtkIOCore-8.0\
        -lvtkIOEnSight-8.0\
        -lvtkIOExodus-8.0\
        -lvtkIOExport-8.0\
        -lvtkIOGeometry-8.0\
        -lvtkIOImage-8.0\
        -lvtkIOImport-8.0\
        -lvtkIOInfovis-8.0\
        -lvtkIOLegacy-8.0\
        -lvtkIOLSDyna-8.0\
        -lvtkIOMINC-8.0\
        -lvtkIOMovie-8.0\
        -lvtkIONetCDF-8.0\
        -lvtkIOParallel-8.0\
        -lvtkIOParallelXML-8.0\
        -lvtkIOPLY-8.0\
        -lvtkIOSQL-8.0\
        -lvtkIOVideo-8.0\
        -lvtkIOXML-8.0\
        -lvtkIOXMLParser-8.0\
        -lvtkjpeg-8.0\
        -lvtkjsoncpp-8.0\
        -lvtklibxml2-8.0\
        -lvtkmetaio-8.0\
        -lvtkNetCDF-8.0\
#        -lvtkNetCDF_c++-8.0\		#因为我的VTK库文件中不存在该文件,所以把它注释掉
        -lvtkoggtheora-8.0\
        -lvtkParallelCore-8.0\
        -lvtkpng-8.0\
        -lvtkproj4-8.0\
        -lvtkRenderingAnnotation-8.0\
        -lvtkRenderingContext2D-8.0\
        -lvtkRenderingContextOpenGL2-8.0\
        -lvtkRenderingCore-8.0\
        -lvtkRenderingFreeType-8.0\
        -lvtkRenderingImage-8.0\
        -lvtkRenderingLabel-8.0\
        -lvtkRenderingLOD-8.0\
        -lvtkRenderingOpenGL2-8.0\
        -lvtkRenderingQt-8.0\
        -lvtkRenderingVolume-8.0\
        -lvtkRenderingVolumeOpenGL2-8.0\
        -lvtksqlite-8.0\
        -lvtksys-8.0\
        -lvtktiff-8.0\
        -lvtkverdict-8.0\
        -lvtkViewsContext2D-8.0\
        -lvtkViewsCore-8.0\
        -lvtkViewsInfovis-8.0\
        -lvtkViewsQt-8.0\
        -lvtkzlib-8.0
}

具体的路径要按照我们自己安装的路径来改一下就行了,现在的软件基本都有替换功能,将上述路径中的C:\PCL替换成你的安装路径就没问题了。
本着学习的态度,我又对上面的一些关键字查了一下帮助文档:
·INCLUDEPATH:当你要编译项目时,通过这个关键字你可以指定需要搜索的#include目录(头文件目录)。
在这里插入图片描述
可能翻译的不怎么好,我也没用机翻,将就着看吧哈哈。
·LIBS:指定要链接到项目中的库列表。如果你是用了Unix系统中的-l和-L符号,那么qmake编译工具就会在Windows系统上正确的处理这些库(即将库的绝对路径传递给链接器)。这个库必须存在,qmake编译工具才可以找到-l库所在的目录位置。
在这里插入图片描述
2、双击.pro文件,在文件中的末尾向其中添加PCL的头文件和库文件的路径,如下所示:
QT配置PCL过程记录(一)_第7张图片
QT配置PCL过程记录(一)_第8张图片
如果你的文件在项目文件夹中,则直接就可以使用include(pcl.pri)就可以了。
4、做完上述的工作之后,我们不要忘了右击项目名,点击执行qmake,如下所示:
QT配置PCL过程记录(一)_第9张图片
执行之后pcl.pri文件也就自动添加到项目中去了,如下所示:
QT配置PCL过程记录(一)_第10张图片
qmake编译工具类似于我们之后要用到的cmake工具,按我的理解就是我们执行qmake命令,就相当于在VC++6.0中执行“编译+链接”,只不过可能qmake工具更方便,功能更为强大,其也不是仅仅只是编译链接而已。

5、项目测试
(1)头文件测试:我们可以像下面一样添加一下头文件试试,如果报错,那就是INCLUDEPATH中的路径没有填正确,如下所示:
QT配置PCL过程记录(一)_第11张图片

#include
#include
#include

(2)库文件测试:如果添加头文件没有报错,那么我们就可以尝试的添加一些代码来测试一下库文件,如下所示:

#include 

#include
#include
#include
#include
using namespace std;

int main(int argc, char *argv[])
{
     
    QCoreApplication a(argc, argv);
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    std::string strfilepath = "rabbit_t.pcd";
    if (-1 == pcl::io::loadPCDFile(strfilepath, *cloud)) //打开点云文件
    {
     
        cout << "error input!" << endl;
        return -1;
    }
    pcl::visualization::CloudViewer viewer("Cloud Viewer");     //创建viewer对象

    cout<<"Point couting:"<<cloud->size()<<endl;
    viewer.showCloud(cloud);
//    viewer.runOnVisualizationThreadOnce(viewerOneOff);
//    system("pause");

    return a.exec();
}

如果没有点云文件,我可以提供一个点云文件:链接:https://pan.baidu.com/s/1iSMApxzvOv9tLfMVizEmaA 提取码:zfpk
点击运行程序,然后就大功告成了。
6、错误分析
这当然是不可能的了,要是仅仅是这样我就不会折腾一天了。运行程序之后,下面的输出界面就开始它的表演了。
(1)error LINK:无法打开***.lib文件。
看到这个信息,我就去到报错的安装路径中找了一下,的确没有这个文件,那么我就采用了眼不见心不烦的做法,把.pro中的这个库文件名给注释掉,注释掉所有报错的库文件名之后呢,那么恭喜你解锁新的错误。
(2)error LNK2019: 无法解析的外部符号×××,该符号在函数×××中被引用。
没办法,只能又去网上去搜索了一下,找了几个小时之后,我归纳了几个原因(以下纯属自己结合网上材料的推测,不一定正确,但也记录一下):
·1>缺少库文件路径。首先,我们应该能够确定,这个错误不是缺少某个.lib文件的问题,因为如果是的话,那么应该会出现(1)中的错误,所以我第一个想到的就是,是不是我的库路径没有全部添加。等我检查一遍之后,发现我的库路径已经全部添加上了,那么就可以排除这种可能。
·2>编译器位数问题。那么现在,我们大概可以判断的是,我们的应用程序应该已经连接上了第三方的库文件,但是他在调用某个东西的时候发生了问题。解决方案:我们可以尝试改变不同位数的编译器来测试程序,如将32位的编译器换成64位的编译器。
·3>库文件的问题。而如果是这种情况,那就是最坏的一种情况了,因为造成这种情况的原因可能就很多了,如网上所说:

【1】C语言和C++语言混编,因为C++支持函数重载所以C++编译器生成的库文件中的函数名会面目全非,也就是说不同语言的命名方式不同,这也就导致了查找的方式不同。
【2】模板声明和实现要放在同一文件夹中,具体可以看https://blog.csdn.net/jtop0/article/details/5779782
【3】 内联函数定义在头文件中。

总的来看,库文件如果自身有问题,那么我们就要修改库文件,可是我们使用的是第三方的PCL库,根本不可能去修改它们。那么,我们就需要重新去编译库文件将这些旧的库文件换掉。就这样第二个重头戏也就来了。

四、VTK8.0.0重新编译(使用cmake工具)

1、将我们下载好的cmake安装包解压,解压之后找到cmake-gui.exe文件。
QT配置PCL过程记录(一)_第12张图片
2、双击该文件,会出现下面的界面。
QT配置PCL过程记录(一)_第13张图片
3、设置输入输出路径并配置生成器信息(注意:输入输出的路径尽可能的不要出现中文名称,因为这可能导致路径乱码,以至于之后再生成库文件的过程中出现错误)。
QT配置PCL过程记录(一)_第14张图片QT配置PCL过程记录(一)_第15张图片
点击确定,即可完成第一次配置。
而cmake的第一次配置给我的感觉就是在检查VTK8.0.0中的头文件和库文件,检查各个头文件和库文件的关系以及这些文件的版本信息等等,这也就是我个人的推测,因为我看到输出界面有许多检查信息。
4、第一次配置完成后,我们就要进行第二次配置,如下所示:
QT配置PCL过程记录(一)_第16张图片
图中的BUILD_EXAMPLES、BUILD_TESTING我们可以加,也可以不加,不过我建议还是不要加上BUILD_EXAMPLES、BUILD_TESTING,因为要是加上了就会造成要编译的项目文件很大,我之前就是都加上了也不知道为什么就说HTTP error(下载错误),可能是VTK8.0下载数据的网站有点问题吧。我的要求只是要生成我所需要的.lib文件应该就可以了,所以我就没管那么多。

QT配置PCL过程记录(一)_第17张图片QT配置PCL过程记录(一)_第18张图片
如果你还想要生成更多的文件,你还可以选择其他选项。除此之外,就是有时候可能没有找到自己想生成的文件,那你可以点击上面的“Advance(高级)”和“Group(组)”选项,再找一下可能会有你说需要的东西。
QT配置PCL过程记录(一)_第19张图片
5、配置好了之后就可以点击“Configure”即可。
在这中间可能会出现下面的情况,如图所示:
QT配置PCL过程记录(一)_第20张图片

你只需要这样配置一下就可以了,如下:
QT配置PCL过程记录(一)_第21张图片
6、再次点击“Configure”,对照下面的信息是否相同。
QT配置PCL过程记录(一)_第22张图片
7、如果相同的话,那就点击“Generate”生成VS项目文件。
QT配置PCL过程记录(一)_第23张图片
8、点击“Open Project”,会调到VS软件中。在保证是编译器是64位的情况下,直接编译Debug(事后来看其实不需要Debug版本的文件)和Release两个版本的文件。
Debug版:
QT配置PCL过程记录(一)_第24张图片
同上过程也可以生成Release版库文件,如果生成结果有错误那就需要重新再来一遍了,这挺麻烦的。
9、生成的文件如下所示:
QT配置PCL过程记录(一)_第25张图片
QT配置PCL过程记录(一)_第26张图片
10、库文件生成成功之后,那么接下来我们就可以右击“INSTALL”,生成我们需要的VTK头文件和库文件,输出路径为我们之前设置的路径(CMAKE_INSTALL_PREFIX)。
QT配置PCL过程记录(一)_第27张图片
QT配置PCL过程记录(一)_第28张图片
到这里,我们的VTK文件已经全部生成完毕。

五、VTK文件重新配置

其实很简单,就是将C:\PCL\PCL1.8.1\3rdParty\VTK替换为我们编译生成的VTK文件(为了方便称呼,我就将前者叫做旧版VTK,后者叫做新版VTK),我是将旧版VTK文件夹改名为VTK8.0,然后将新版VTK文件整个都复制过去就行了。
QT配置PCL过程记录(一)_第29张图片
不过我们还要注意的就是,新版VTK文件中没有Debug版的.lib文件,我想这应该是我们在“INSTALL”生成的时候只能生成Release版本的.lib文件。
新版VTK库文件:
QT配置PCL过程记录(一)_第30张图片
旧版本VTK库文件:
QT配置PCL过程记录(一)_第31张图片
所以我们没有办法在Debug模式下运行程序,所以就只能在Release模式下运行,不过这已经够用了。
抱着不死心的态度,我又在VS中配置了一下PCL,这次是用的旧版的VTK库文件,在VS中Debug模式下程序成功运行,不过这好像并没有什么用哈哈。

六、程序测试

1、测试代码如下:

#include 

#include
#include
#include
#include
using namespace std;

int main(int argc, char *argv[])
{
     
    QCoreApplication a(argc, argv);
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
    std::string strfilepath = "D:/ComputerLanguage/C++/QT/QtPractice/ConsoleTest/rabbit_t.pcd";
    if (-1 == pcl::io::loadPCDFile(strfilepath, *cloud)) //打开点云文件
    {
     
        cout << "error input!" << endl;
        return -1;
    }
    pcl::visualization::CloudViewer viewer("Cloud Viewer");     //创建viewer对象

    cout<<"Point couting:"<<cloud->size()<<endl;
    viewer.showCloud(cloud);
//    viewer.runOnVisualizationThreadOnce(viewerOneOff);
//    system("pause");

    return a.exec();
}

QT配置PCL过程记录(一)_第32张图片
2、运行程序及实现效果。
QT配置PCL过程记录(一)_第33张图片QT配置PCL过程记录(一)_第34张图片3、最后的礼物。
特别要注意的是,我们之前在生成新版VTK的过程中,除了生成了新的VTK文件之外,还生成了一个插件,看下图去找到它吧。
QT配置PCL过程记录(一)_第35张图片
将它放到C:\Qt\Qt5.9.4\5.9.4\msvc2015_64\plugins\designer文件夹中,打开Qt的64位designer就会发现产生了一个新的控件。
QT配置PCL过程记录(一)_第36张图片
QT配置PCL过程记录(一)_第37张图片
不过遗憾的是我还没有学会使用它,到这里算是真的结束了。

七、小结

折腾了一天之后,总算是配置成功了,怎么说呢,感觉自己在这个过程中也学到了一点东西,就是要学会去分析程序出现的错误,冷静去思考错误的信息也是一种学习吧。

补:QT配置PCL过程记录(二)

你可能感兴趣的:(PCL)