Win10 + qt5.6.3 + pcl1.8.0 环境搭建(安装、配置)
网上很多帖都是在 VS 下搭建的 qt 和 pcl 库,而本人是在 Qt Creator 下搭建的环境,所以过程有些坎坷,特此记录一下。
先甩个锅咯~~~由于机器的差别,所以可能会出现别的错误,这里分享的是我遇到的错误噢。。。
首先给出系统环境以及配置信息:
系统:Win10 64位
QT库版本:5.6.3 MSVC
PCL库版本:1.8.0 MSVC
简单说一下概念,Qt Creator 是开发环境(IDE),qt 库和 pcl 库是第三方库,MinGW、MSVC 是两种不同的编译器。这两个第三方库是需要经过编译才能使用的,而为了省去大家的麻烦,官方提供了已经被某些版本的编译器编译过的库,直接安装就可以使用,称为 预编译版。所以,才会有不同版本的预编译版的库,在安装的时候要选择同一种编译器编译的库才最保险。当然,不嫌麻烦的话,完全可以自己重新编译一下,这个大家就自己查资料吧。。。
好了,说说编译器版本选择的问题,网上有帖分析这两种编译器,不过个人感觉还是萝卜白菜各有所爱。我为什么用 MSVC 版的呢?因为 PCL 官网提供的 Windows 下面的预编译版库只有 MSVC 版的,我下的这个也是从网上找的链接。还有一个原因是,我之前在电脑上装过 VS2013,安装它的时候,电脑上就自动安装了 MSVC2013 编译器。
好,下面进入正题,安装过程(由于是傻瓜式安装没什么好说的,就不详细展开了):
1. MSVC 编译器的问题
MSVC 是 Microsoft Visual C++ 的缩写。由于之前我已经安装了 VS 2013,所以就不需要再安装了,电脑上已经有 MSVC2013 编译器了。如果没有安装 VS 的话,要么安装 VS,要么只安装 MSVC 编译器,网上可以查得到很多帖。我的是 2013 版本,所以以下均以此为依据。如果是 VS2015 的话,那就是 MSVC2015 版本。
2. CDB 调试器的问题
编译器是用来编译程序的,而调试器是 debug 程序的时候要用到的,要在 Qt Creator 里面调试 Windows 程序,就需要安装相应的调试器。
有一个东西叫 Windows Debugging Tools,里面有一个 cdb.exe,我们需要的就是这个东西。当然,不需要调试程序的朋友们,就不用安装这个调试工具了。
在安装的时候,有个界面是选择安装哪些东西的,只选择那个 debugging tools 就行了,参考网页:
https://blog.csdn.net/FORmingtian/article/details/84526971
安装路径默认就行了,不然 Qt Creator 不能自动检测到,还得手动设置。
3. 安装 Qt Creator + qt 库
Qt 官方提供了一个安装程序,里面包含了 Qt Creator、qt 库以及编译所需要的各种工具,这是各版本下载链接。我下载的是:
qt-opensource-windows-x86-msvc2013-5.6.3.exe
直接运行,安装路径最好不要有中文和空格,然后一路 next 安装就可以了,其中有一个界面是选择需要安装哪些东西,反正我是全选了。
4. 安装 PCL 库
PCL 官网只给了 MSVC 版本的预编译库,而且版本还不新,我是从网上找的一个网址下的 1.8.0 的库:
PCL-1.8.0-AllInOne-msvc2013-win32.exe
这个安装程序从名字就可以看出来,是一个究极傻瓜式安装包,里面包含了 Boost、Eigen、FLANN、OpenNI2、Qhull、VTK,当然都是与这个版本 pcl 匹配的版本。
直接运行安装程序,同样的,安装路径不要有中文和空格。安装过程中,有一个界面是选择是否要创建环境变量的,默认是不创建,应该选第二个,对所有用户创建。
安装完成后,还要设置额外的环境变量才可以正常使用,不然 Qt 程序总会报错 “程序无法启动”,这个是我的环境变量(Path)截图:
设置好环境变量后,电脑重启。
然后打开 Qt Creator,别跟我说找不到图标,小娜那里搜索qt就行了。
打开 工具--选项--构建和运行--构建套件,下面这样就没问题了:
其中,调试器那一栏,如果是默认路径安装的前面的 Windows SDK,那它会自动检测到,如果改了路径,这里就手动设置一下。前面也说过了,没有调试器也可以运行程序,release 方式运行就行。但是编译器那一栏必须有,不然程序无法编译运行!!
5. Pro 文件
我是要调用 PCL,所以内容如下(根据自己的项目名啥的自己根据需要选择复制):
#------------------------------------------------- # # Project created by QtCreator 2019-02-18T20:56:54 # #------------------------------------------------- QT += core gui greaterThan(QT_MAJOR_VERSION, 4): QT += widgets TARGET = zaoshengjiqiren TEMPLATE = app SOURCES += main.cpp\ mainwindow.cpp \ loginwindow.cpp \ settingswindow.cpp HEADERS += mainwindow.h \ loginwindow.h \ settingswindow.h INCLUDEPATH += $(PCL_ROOT)/include/pcl-1.8 \ $(PCL_ROOT)/include/pcl-1.8/pcl \ $(PCL_ROOT)/3rdParty/Boost/include/boost-1_59 \ $(PCL_ROOT)/3rdParty/Eigen/eigen3 \ #${PCL_ROOT}/3rdParty/FLANN/include \ $(PCL_ROOT)/3rdParty/FLANN/include/flann \ D:/pcl-1.8.0/OpenNI2/Include \ $(PCL_ROOT)/3rdParty/Qhull/include \ $(PCL_ROOT)/3rdParty/VTK/include/vtk-7.0 CONFIG(debug,debug|release){ LIBS += -L$(PCL_ROOT)/lib\ #-lpcl_apps_debug\ -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_simulation_debug\ -lpcl_stereo_debug\ -lpcl_surface_debug\ -lpcl_tracking_debug\ -lpcl_visualization_debug\ LIBS += -L$(PCL_ROOT)/3rdParty/Boost/lib\ -llibboost_atomic-vc120-mt-gd-1_59\ -llibboost_chrono-vc120-mt-gd-1_59\ -llibboost_container-vc120-mt-gd-1_59\ -llibboost_context-vc120-mt-gd-1_59\ -llibboost_coroutine-vc120-mt-gd-1_59\ -llibboost_date_time-vc120-mt-gd-1_59\ -llibboost_exception-vc120-mt-gd-1_59\ -llibboost_filesystem-vc120-mt-gd-1_59\ -llibboost_graph-vc120-mt-gd-1_59\ -llibboost_iostreams-vc120-mt-gd-1_59\ -llibboost_locale-vc120-mt-gd-1_59\ -llibboost_log-vc120-mt-gd-1_59\ -llibboost_log_setup-vc120-mt-gd-1_59\ -llibboost_math_c99-vc120-mt-gd-1_59\ -llibboost_math_c99f-vc120-mt-gd-1_59\ -llibboost_math_c99l-vc120-mt-gd-1_59\ -llibboost_math_tr1-vc120-mt-gd-1_59\ -llibboost_math_tr1f-vc120-mt-gd-1_59\ -llibboost_math_tr1l-vc120-mt-gd-1_59\ -llibboost_mpi-vc120-mt-gd-1_59\ -llibboost_prg_exec_monitor-vc120-mt-gd-1_59\ -llibboost_program_options-vc120-mt-gd-1_59\ -llibboost_random-vc120-mt-gd-1_59\ -llibboost_regex-vc120-mt-gd-1_59\ -llibboost_serialization-vc120-mt-gd-1_59\ -llibboost_signals-vc120-mt-gd-1_59\ -llibboost_system-vc120-mt-gd-1_59\ -llibboost_test_exec_monitor-vc120-mt-gd-1_59\ -llibboost_thread-vc120-mt-gd-1_59\ -llibboost_timer-vc120-mt-gd-1_59\ -llibboost_unit_test_framework-vc120-mt-gd-1_59\ -llibboost_wave-vc120-mt-gd-1_59\ -llibboost_wserialization-vc120-mt-gd-1_59 LIBS += -L$(PCL_ROOT)/3rdParty/FLANN/lib\ -lflann-gd\ -lflann_cpp_s-gd\ -lflann_s-gd LIBS += -LD:/pcl-1.8.0/OpenNI2/Lib\ -lOpenNI2 LIBS += -L$(PCL_ROOT)/3rdParty/Qhull/lib\ -lqhull-gd\ -lqhullcpp-gd\ -lqhullstatic-gd\ -lqhullstatic_r-gd\ -lqhull_p-gd\ -lqhull_r-gd LIBS += -L$(PCL_ROOT)/3rdParty/VTK/lib\ -lvtkalglib-7.0-gd\ -lvtkChartsCore-7.0-gd\ -lvtkCommonColor-7.0-gd\ -lvtkCommonComputationalGeometry-7.0-gd\ -lvtkCommonCore-7.0-gd\ -lvtkCommonDataModel-7.0-gd\ -lvtkCommonExecutionModel-7.0-gd\ -lvtkCommonMath-7.0-gd\ -lvtkCommonMisc-7.0-gd\ -lvtkCommonSystem-7.0-gd\ -lvtkCommonTransforms-7.0-gd\ -lvtkDICOMParser-7.0-gd\ -lvtkDomainsChemistry-7.0-gd\ -lvtkDomainsChemistryOpenGL2-7.0-gd\ -lvtkexoIIc-7.0-gd\ -lvtkexpat-7.0-gd\ -lvtkFiltersAMR-7.0-gd\ -lvtkFiltersCore-7.0-gd\ -lvtkFiltersExtraction-7.0-gd\ -lvtkFiltersFlowPaths-7.0-gd\ -lvtkFiltersGeneral-7.0-gd\ -lvtkFiltersGeneric-7.0-gd\ -lvtkFiltersGeometry-7.0-gd\ -lvtkFiltersHybrid-7.0-gd\ -lvtkFiltersHyperTree-7.0-gd\ -lvtkFiltersImaging-7.0-gd\ -lvtkFiltersModeling-7.0-gd\ -lvtkFiltersParallel-7.0-gd\ -lvtkFiltersParallelImaging-7.0-gd\ -lvtkFiltersProgrammable-7.0-gd\ -lvtkFiltersSelection-7.0-gd\ -lvtkFiltersSMP-7.0-gd\ -lvtkFiltersSources-7.0-gd\ -lvtkFiltersStatistics-7.0-gd\ -lvtkFiltersTexture-7.0-gd\ -lvtkFiltersVerdict-7.0-gd\ -lvtkfreetype-7.0-gd\ -lvtkGeovisCore-7.0-gd\ -lvtkglew-7.0-gd\ -lvtkGUISupportQt-7.0-gd\ -lvtkGUISupportQtSQL-7.0-gd\ -lvtkhdf5-7.0-gd\ -lvtkhdf5_hl-7.0-gd\ -lvtkImagingColor-7.0-gd\ -lvtkImagingCore-7.0-gd\ -lvtkImagingFourier-7.0-gd\ -lvtkImagingGeneral-7.0-gd\ -lvtkImagingHybrid-7.0-gd\ -lvtkImagingMath-7.0-gd\ -lvtkImagingMorphological-7.0-gd\ -lvtkImagingSources-7.0-gd\ -lvtkImagingStatistics-7.0-gd\ -lvtkImagingStencil-7.0-gd\ -lvtkInfovisCore-7.0-gd\ -lvtkInfovisLayout-7.0-gd\ -lvtkInteractionImage-7.0-gd\ -lvtkInteractionStyle-7.0-gd\ -lvtkInteractionWidgets-7.0-gd\ -lvtkIOAMR-7.0-gd\ -lvtkIOCore-7.0-gd\ -lvtkIOEnSight-7.0-gd\ -lvtkIOExodus-7.0-gd\ -lvtkIOExport-7.0-gd\ -lvtkIOGeometry-7.0-gd\ -lvtkIOImage-7.0-gd\ -lvtkIOImport-7.0-gd\ -lvtkIOInfovis-7.0-gd\ -lvtkIOLegacy-7.0-gd\ -lvtkIOLSDyna-7.0-gd\ -lvtkIOMINC-7.0-gd\ -lvtkIOMovie-7.0-gd\ -lvtkIONetCDF-7.0-gd\ -lvtkIOParallel-7.0-gd\ -lvtkIOParallelXML-7.0-gd\ -lvtkIOPLY-7.0-gd\ -lvtkIOSQL-7.0-gd\ -lvtkIOVideo-7.0-gd\ -lvtkIOXML-7.0-gd\ -lvtkIOXMLParser-7.0-gd\ -lvtkjpeg-7.0-gd\ -lvtkjsoncpp-7.0-gd\ -lvtklibxml2-7.0-gd\ -lvtkmetaio-7.0-gd\ -lvtkNetCDF-7.0-gd\ -lvtkNetCDF_cxx-7.0-gd\ -lvtkoggtheora-7.0-gd\ -lvtkParallelCore-7.0-gd\ -lvtkpng-7.0-gd\ -lvtkproj4-7.0-gd\ -lvtkRenderingAnnotation-7.0-gd\ -lvtkRenderingContext2D-7.0-gd\ -lvtkRenderingContextOpenGL2-7.0-gd\ -lvtkRenderingCore-7.0-gd\ -lvtkRenderingFreeType-7.0-gd\ -lvtkRenderingImage-7.0-gd\ -lvtkRenderingLabel-7.0-gd\ -lvtkRenderingLOD-7.0-gd\ -lvtkRenderingOpenGL2-7.0-gd\ -lvtkRenderingQt-7.0-gd\ -lvtkRenderingVolume-7.0-gd\ -lvtkRenderingVolumeOpenGL2-7.0-gd\ -lvtksqlite-7.0-gd\ -lvtksys-7.0-gd\ -lvtktiff-7.0-gd\ -lvtkverdict-7.0-gd\ -lvtkViewsContext2D-7.0-gd\ -lvtkViewsCore-7.0-gd\ -lvtkViewsInfovis-7.0-gd\ -lvtkViewsQt-7.0-gd\ -lvtkzlib-7.0-gd }else { LIBS += -L$(PCL_ROOT)/lib\ # -lpcl_apps_release\ -lpcl_common_release\ -lpcl_features_release\ -lpcl_filters_release\ -lpcl_io_release\ -lpcl_io_ply_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_simulation_release\ -lpcl_stereo_release\ -lpcl_surface_release\ -lpcl_tracking_release\ -lpcl_visualization_release\ LIBS += -L$(PCL_ROOT)/3rdParty/Boost/lib\ -llibboost_atomic-vc120-mt-1_59\ -llibboost_chrono-vc120-mt-1_59\ -llibboost_container-vc120-mt-1_59\ -llibboost_context-vc120-mt-1_59\ -llibboost_coroutine-vc120-mt-1_59\ -llibboost_date_time-vc120-mt-1_59\ -llibboost_exception-vc120-mt-1_59\ -llibboost_filesystem-vc120-mt-1_59\ -llibboost_graph-vc120-mt-1_59\ -llibboost_iostreams-vc120-mt-1_59\ -llibboost_locale-vc120-mt-1_59\ -llibboost_log-vc120-mt-1_59\ -llibboost_log_setup-vc120-mt-1_59\ -llibboost_math_c99-vc120-mt-1_59\ -llibboost_math_c99f-vc120-mt-1_59\ -llibboost_math_c99l-vc120-mt-1_59\ -llibboost_math_tr1-vc120-mt-1_59\ -llibboost_math_tr1f-vc120-mt-1_59\ -llibboost_math_tr1l-vc120-mt-1_59\ -llibboost_mpi-vc120-mt-1_59\ -llibboost_prg_exec_monitor-vc120-mt-1_59\ -llibboost_program_options-vc120-mt-1_59\ -llibboost_random-vc120-mt-1_59\ -llibboost_regex-vc120-mt-1_59\ -llibboost_serialization-vc120-mt-1_59\ -llibboost_signals-vc120-mt-1_59\ -llibboost_system-vc120-mt-1_59\ -llibboost_test_exec_monitor-vc120-mt-1_59\ -llibboost_thread-vc120-mt-1_59\ -llibboost_timer-vc120-mt-1_59\ -llibboost_unit_test_framework-vc120-mt-1_59\ -llibboost_wave-vc120-mt-1_59\ -llibboost_wserialization-vc120-mt-1_59 LIBS += -L$(PCL_ROOT)/3rdParty/FLANN/lib\ -lflann\ -lflann_cpp_s\ -lflann_s LIBS += -LD:/pcl-1.8.0/OpenNI2/Lib\ -lOpenNI2 LIBS += -L$(PCL_ROOT)/3rdParty/Qhull/lib\ -lqhull\ -lqhullcpp\ -lqhullstatic\ -lqhullstatic_r\ -lqhull_p\ -lqhull_r LIBS += -L$(PCL_ROOT)/3rdParty/VTK/lib\ -lvtkalglib-7.0\ -lvtkChartsCore-7.0\ -lvtkCommonColor-7.0\ -lvtkCommonComputationalGeometry-7.0\ -lvtkCommonCore-7.0\ -lvtkCommonDataModel-7.0\ -lvtkCommonExecutionModel-7.0\ -lvtkCommonMath-7.0\ -lvtkCommonMisc-7.0\ -lvtkCommonSystem-7.0\ -lvtkCommonTransforms-7.0\ -lvtkDICOMParser-7.0\ -lvtkDomainsChemistry-7.0\ -lvtkDomainsChemistryOpenGL2-7.0\ -lvtkexoIIc-7.0\ -lvtkexpat-7.0\ -lvtkFiltersAMR-7.0\ -lvtkFiltersCore-7.0\ -lvtkFiltersExtraction-7.0\ -lvtkFiltersFlowPaths-7.0\ -lvtkFiltersGeneral-7.0\ -lvtkFiltersGeneric-7.0\ -lvtkFiltersGeometry-7.0\ -lvtkFiltersHybrid-7.0\ -lvtkFiltersHyperTree-7.0\ -lvtkFiltersImaging-7.0\ -lvtkFiltersModeling-7.0\ -lvtkFiltersParallel-7.0\ -lvtkFiltersParallelImaging-7.0\ -lvtkFiltersProgrammable-7.0\ -lvtkFiltersSelection-7.0\ -lvtkFiltersSMP-7.0\ -lvtkFiltersSources-7.0\ -lvtkFiltersStatistics-7.0\ -lvtkFiltersTexture-7.0\ -lvtkFiltersVerdict-7.0\ -lvtkfreetype-7.0\ -lvtkGeovisCore-7.0\ -lvtkglew-7.0\ -lvtkGUISupportQt-7.0\ -lvtkGUISupportQtSQL-7.0\ -lvtkhdf5-7.0\ -lvtkhdf5_hl-7.0\ -lvtkImagingColor-7.0\ -lvtkImagingCore-7.0\ -lvtkImagingFourier-7.0\ -lvtkImagingGeneral-7.0\ -lvtkImagingHybrid-7.0\ -lvtkImagingMath-7.0\ -lvtkImagingMorphological-7.0\ -lvtkImagingSources-7.0\ -lvtkImagingStatistics-7.0\ -lvtkImagingStencil-7.0\ -lvtkInfovisCore-7.0\ -lvtkInfovisLayout-7.0\ -lvtkInteractionImage-7.0\ -lvtkInteractionStyle-7.0\ -lvtkInteractionWidgets-7.0\ -lvtkIOAMR-7.0\ -lvtkIOCore-7.0\ -lvtkIOEnSight-7.0\ -lvtkIOExodus-7.0\ -lvtkIOExport-7.0\ -lvtkIOGeometry-7.0\ -lvtkIOImage-7.0\ -lvtkIOImport-7.0\ -lvtkIOInfovis-7.0\ -lvtkIOLegacy-7.0\ -lvtkIOLSDyna-7.0\ -lvtkIOMINC-7.0\ -lvtkIOMovie-7.0\ -lvtkIONetCDF-7.0\ -lvtkIOParallel-7.0\ -lvtkIOParallelXML-7.0\ -lvtkIOPLY-7.0\ -lvtkIOSQL-7.0\ -lvtkIOVideo-7.0\ -lvtkIOXML-7.0\ -lvtkIOXMLParser-7.0\ -lvtkjpeg-7.0\ -lvtkjsoncpp-7.0\ -lvtklibxml2-7.0\ -lvtkmetaio-7.0\ -lvtkNetCDF-7.0\ -lvtkNetCDF_cxx-7.0\ -lvtkoggtheora-7.0\ -lvtkParallelCore-7.0\ -lvtkpng-7.0\ -lvtkproj4-7.0\ -lvtkRenderingAnnotation-7.0\ -lvtkRenderingContext2D-7.0\ -lvtkRenderingContextOpenGL2-7.0\ -lvtkRenderingCore-7.0\ -lvtkRenderingFreeType-7.0\ -lvtkRenderingImage-7.0\ -lvtkRenderingLabel-7.0\ -lvtkRenderingLOD-7.0\ -lvtkRenderingOpenGL2-7.0\ -lvtkRenderingQt-7.0\ -lvtkRenderingVolume-7.0\ -lvtkRenderingVolumeOpenGL2-7.0\ -lvtksqlite-7.0\ -lvtksys-7.0\ -lvtktiff-7.0\ -lvtkverdict-7.0\ -lvtkViewsContext2D-7.0\ -lvtkViewsCore-7.0\ -lvtkViewsInfovis-7.0\ -lvtkViewsQt-7.0\ -lvtkzlib-7.0 }
注意:
1. 里面 INCLUDEPATH 设置,把 OpenNI2 路径改成自己的。
2. 里面我有几行是注释的,因为这个内容我是从别的帖粘过来的,而我安装的这个版本的 PCL 有两个库是没有的。
3. 理论上,以 release 方式编译运行程序,只需要添加 release 版的库就行了。这个 CONFIG(debug, debug|release) 的意思是根据程序需要自动选择 debug 版本还是 release 版本库(先添加的是 debug,后面的是 release 版,看库名字也可以看出来)。这个 OpenNI 好像不支持调试,所以 debug 方式不能成功运行程序,我这里是这样的,所以我一直是以 release 方式运行。如果你们知道解决方法,欢迎下面留个言告知一下嘻嘻~~
好啦,到这里就结束啦,开启你的 Qt 之旅吧~~~