【Learning PCL】win10+VS2015 环境下配置PCL1.8.1

作为最近刚接触点云的小白,在经历配置PCL1.8.1的各种抓狂后,终于成功,当然期间也参考了其他很多博主的教程,在此表示感谢,感谢各位巨人的肩膀!现整理如下,一来作为记录自己学习点云的笔记,二来也愿能起到赠人玫瑰,帮到他人的作用。

PCL 环境搭建

VS版本:VS 2015
Windows版本:Windows 10 64位
PCL版本:1.8.1

PCL(Point Cloud Library)是在吸收了前人点云相关研究基础上建立起来的大型跨平台开源C++编程库,它实现了大量点云相关的通用算法和高效数据结构,涉及到点云获取、滤波、分割、配准、检索、特征提取、识别、追踪、曲面重建、可视化等。支持多种操作系统平台,可在Windows、Linux、Android、Mac OS X、部分嵌入式实时系统上运行。如果说OpenCV是2D信息获取与处理的结晶,那么PCL就在3D信息获取与处理上具有同等地位,PCL是BSD授权方式,可以免费进行商业和学术应用。 —-摘自PCL中文官网

1. 版本选择

Window下可以选择all-in-one版本或者选择自己下载依赖,总共有boost,Eigen等库,个人建议使用all-in-one版本(它包含了很多第三方编译包,其中包括VTK),这样方便管理和引入,独立下载依赖的话安装完后比较分散。
下载对应VS版本的PCL AllInOne安装包。要下对安装包,需要了解安装包的命名的含义,以下面的一个AllInOne包的名字为例。

   PCL-1.8.0-AllInOne-msvc2013-win32.exe

其中,1.8.0表示的PCL的版本号,然后2013表示这个安装包只适用于VS2013中使用,其它VS版本不行,最后win32表示这个安装包只能用来开发32位的程序。

再以下面的安装包名字为例。

   PCL-1.7.2-AllInOne-msvc2012-win64.exe

这个安装包是PCL1.7.2版本的,其只能用在VS2012上,然后使用在64位的VS项目开发中。

  注意一定要下载正确的对应VS版本以及想要开发的程序位数对应的AllInOne包。

本人电脑是win10 64位系统,VS2015配置,选择以下两个安装包:
在这里插入图片描述
下载地址:https://github.com/PointCloudLibrary/pcl/releases

2. PCL的安装配置

2.1 PLC1.8.1安装过程

  整个安装过程需要注意以下三点,其它默认即可:
  1. 安装路径最好不要包括中文;

  2. 建议勾选上“Add PCL to the system PATH for all users”;
    在这里插入图片描述

  3. 路径中不要有任何空格,如下图系统会自动给你生成有空格的路径,你需要修改去掉空格就行,这样做的目的是如果以后用到了QT,QT是不能识别空格的路径的,所以建议这里删掉空格,当然不用QT可以忽略。
    本人路径:D:\PCL1.8.1\PCL1.8.1。第二个PCL1.8.1文件夹是软件生成的,需要删掉空格。
    在这里插入图片描述

  4. 安装时,会提示安装OpenNI,这个建议安装在PCL安装路径的3rdParty下的OpenNI2文件夹中。
    在这里插入图片描述
    等待一会儿就安装完成了,安装过后可能会有窗口警告提示你路径太长,添加不了之类的错误提示,不用管不影响。

2.2 PLC1.8.1变量配置

进入系统设置>>高级>>环境变量
在这里插入图片描述
之前勾选了Add PCL to system PATH for all users,安装好后,系统变量里会自动出现如下图所示的4个变量:
在这里插入图片描述
然后双击系统变量中的Path,进入编辑环境变量,手动添加以下6个环境变量:
%PCL_ROOT\bin;
%PCL_ROOT%\3rdParty\VTK\bin;
%PCL_ROOT\3rdParty\FLANN\bin;
%OPENNI2_REDIST64%;
%PCL_ROOT%\3rdParty\Qhull\bin;
%PCL_ROOT%\3rdParty\OpenNI2\Tools
在这里插入图片描述
然后重启电脑使变量生效。

最后解压之前下载的PCL-1.8.1-pdb-msvc2015-win64.zip,将里面的pdb文件全部复制到PCL安装路径下bin文件夹中,本人路径 D:\PCL1.8.1\PCL1.8.1\bin

3.配置VS2015开发环境

在配置项目属性环节,需要了解的是编译出来的程序分为两种32位和64位。不同位数的程序需要对应版本的lib和dll才能编译成功。这里想要编译什么位数的程序,下载对应位数的PCL即可。不同位数的程序又分为:Debug和Release。默认生成的是Debug程序。编译Debug版本的程序需要Debug版本的lib和dll,编译Release版本的程序需要Release版本的lib和dll。这些lib和dll在PCL的安装路径路径里有。如果需要生成上述四种程序,需要分别设置对应的项目属性表。

根据当前需要编译的程序位数和传统的直接在“解决方案资源管理器”里选中项目右键设置项目属性的方式,不太灵活。这里以创建属性表的方式来配置VS。这个根据你当前需要生成的程序,往“属性管理器”里项目下对应子项里添加属性表,并配置属性表相关项目,即可成功编译PCL。

注意:VS默认只生成32位的程序,如果需要生成64的程序,方法如下:VS界面有个运行项,后面有个debug,在后面有个叫“解决方案平台”的下拉框,其值默认为win32,需要把win32,改成x64,方法是,点win32的箭头,点“配置管理器”,点“活动解决方案平台”,点“新建”,把“键入或选择新平台”,这一项,切换为x64,然后确定,此时,原来的win32已变为x64。这时编译生成的程序就是64位版本的。

添加属性表的话,找到“属性管理器”,然后点击项目的小箭头,如果是32的程序,会出来以下两项:Debug|Win32以及Release|Win32,而如果是64位的程序,则会多出两项:Debug|x64以及Release|x64。选中其中一项,右键点击“添加新项目属性表”,在弹出的对话框里设置好对应的属性表名和路径。确认之后,在该项中就会多出一项以刚才属性表名为名称的属性表。

  在新建的属性表里,有三个必须设置的重要项目:附加包含目录,附加库目录,附加依赖项。

附加包含目录,其在项目属性“C/C++”子项的“常规”里下,主要用来设置库的头文件路径。这里设置好PCL及第三方库的头文件路径。
附加库目录,其在项目属性的“连接器”子项的“常规”下,主要用来设置库的lib文件路径。这里设置好设置PCL及第三方库的lib文件路径。
附加依赖项,其在项目属性的“连接器”子项的“输入”下,主要用来设置编译所需的lib。这里设置好设置PCL及第三方库的lib文件名。
只有理解里上面这三项的作用,才能学到如何去解决配置中产生的一些问题。

在配置完属性表后,还需要配置dll。配置dll有四种方法,第一种,把dll拷贝到system32里去,第二种,把dll拷贝到编译出来的程序的文件中,第三种,在系统的path中添加dll的路径,本文选用第四种方法,直接配置到项目中。具体方法如下:

在“解决方案资源管理器”里选中项目右键点“属性”,然后选“调试”设置环境的变量值,规则如下:

PATH=;$(PATH)

在等号后添加所有PCL及第三方库的dll路径以英文的“;”隔开,最后加上一个$(PATH)即可。例如我设置的如下:

PATH=KaTeX parse error: Expected 'EOF', got '\bin' at position 11: (PCL_ROOT)\̲b̲i̲n̲;(PCL_ROOT)\3rdParty\FLANN\bin;KaTeX parse error: Expected 'EOF', got '\3' at position 11: (PCL_ROOT)\̲3̲rdParty\VTK\bin…(PCL_ROOT)\Qhull\bin;KaTeX parse error: Expected 'EOF', got '\3' at position 11: (PCL_ROOT)\̲3̲rdParty\OpenNI2…(PATH)

大家根据自己的安装路径,灵活变通。

3.1Debug下配置

1.新建一个控制台应用程序
一般在VS里创建一个C++的控制台项目,根据自己的意愿设置一下项目名和路径。在新建过程中注意以下两点,其它默认即可:

  • 去掉“预编译头(P)”前的勾
  • 去掉“安全开发生命周期(SDL)检查©”前的勾。

在这里插入图片描述
2.新建一个项目
debug后面一项默认为win32值,将其改为x64(注:我这里用的是debug项)
在这里插入图片描述
在这里插入图片描述
3.打开属性管理器,找到Debug|64,右键添加新项目属性表,这里命名为PCL1.8.1Debug64.props,默认的保存位置就是项目所在目录下。点击确定。然后就可以在Debug|64下看到新添加的属性表。
在这里插入图片描述
4.双击PCL1.8.1Debug64属性,在属性中配置各项。

1)添加包含目录和库目录。
在这里插入图片描述
包含目录添加如下路径(根据自己的路径一一对应起来)
D:\PCL1.8.1\PCL1.8.1\3rdParty\OpenNI2\Include;
D:\PCL1.8.1\PCL1.8.1\include\pcl-1.8;
D:\PCL1.8.1\PCL1.8.1\3rdParty\VTK\include\vtk-8.0;
D:\PCL1.8.1\PCL1.8.1\3rdParty\Qhull\include;
D:\PCL1.8.1\PCL1.8.1\3rdParty\FLANN\include;
D:\PCL1.8.1\PCL1.8.1\3rdParty\Eigen\eigen3;
D:\PCL1.8.1\PCL1.8.1\3rdParty\Boost\include\boost-1_64;
在这里插入图片描述
库目录添加如下路径(根据自己的路径一一对应起来)
D:\PCL1.8.1\PCL1.8.1\3rdParty\OpenNI2\Lib;
D:\PCL1.8.1\PCL1.8.1\3rdParty\VTK\lib;
D:\PCL1.8.1\PCL1.8.1\3rdParty\Qhull\lib;
D:\PCL1.8.1\PCL1.8.1\3rdParty\FLANN\lib;
D:\PCL1.8.1\PCL1.8.1\3rdParty\Boost\lib;
D:\PCL1.8.1\PCL1.8.1\lib;
在这里插入图片描述
2)添加附加依赖项

找到连接器->输入->附加依赖项,编辑。

添加以下内容:

pcl_common_debug.lib

pcl_features_debug.lib

pcl_filters_debug.lib

pcl_io_debug.lib

pcl_io_ply_debug.lib

pcl_kdtree_debug.lib

pcl_keypoints_debug.lib

pcl_ml_debug.lib

pcl_octree_debug.lib

pcl_outofcore_debug.lib

pcl_people_debug.lib

pcl_recognition_debug.lib

pcl_registration_debug.lib

pcl_sample_consensus_debug.lib

pcl_search_debug.lib

pcl_segmentation_debug.lib

pcl_stereo_debug.lib

pcl_surface_debug.lib

pcl_tracking_debug.lib

pcl_visualization_debug.lib

flann-gd.lib

flann_cpp-gd.lib

flann_cpp_s-gd.lib

flann_s-gd.lib

OpenNI2.lib

qhullcpp_d.lib

qhullstatic_d.lib

qhullstatic_r_d.lib

qhull_d.lib

qhull_p_d.lib

qhull_r_d.lib

vtkalglib-8.0-gd.lib

vtkChartsCore-8.0-gd.lib

vtkCommonColor-8.0-gd.lib

vtkCommonComputationalGeometry-8.0-gd.lib

vtkCommonCore-8.0-gd.lib

vtkCommonDataModel-8.0-gd.lib

vtkCommonExecutionModel-8.0-gd.lib

vtkCommonMath-8.0-gd.lib

vtkCommonMisc-8.0-gd.lib

vtkCommonSystem-8.0-gd.lib

vtkCommonTransforms-8.0-gd.lib

vtkDICOMParser-8.0-gd.lib

vtkDomainsChemistry-8.0-gd.lib

vtkexoIIc-8.0-gd.lib

vtkexpat-8.0-gd.lib

vtkFiltersAMR-8.0-gd.lib

vtkFiltersCore-8.0-gd.lib

vtkFiltersExtraction-8.0-gd.lib

vtkFiltersFlowPaths-8.0-gd.lib

vtkFiltersGeneral-8.0-gd.lib

vtkFiltersGeneric-8.0-gd.lib

vtkFiltersGeometry-8.0-gd.lib

vtkFiltersHybrid-8.0-gd.lib

vtkFiltersHyperTree-8.0-gd.lib

vtkFiltersImaging-8.0-gd.lib

vtkFiltersModeling-8.0-gd.lib

vtkFiltersParallel-8.0-gd.lib

vtkFiltersParallelImaging-8.0-gd.lib

vtkFiltersPoints-8.0-gd.lib

vtkFiltersProgrammable-8.0-gd.lib

vtkFiltersSelection-8.0-gd.lib

vtkFiltersSMP-8.0-gd.lib

vtkFiltersSources-8.0-gd.lib

vtkFiltersStatistics-8.0-gd.lib

vtkFiltersTexture-8.0-gd.lib

vtkFiltersTopology-8.0-gd.lib

vtkFiltersVerdict-8.0-gd.lib

vtkfreetype-8.0-gd.lib

vtkGeovisCore-8.0-gd.lib

vtkgl2ps-8.0-gd.lib

vtkhdf5-8.0-gd.lib

vtkhdf5_hl-8.0-gd.lib

vtkImagingColor-8.0-gd.lib

vtkImagingCore-8.0-gd.lib

vtkImagingFourier-8.0-gd.lib

vtkImagingGeneral-8.0-gd.lib

vtkImagingHybrid-8.0-gd.lib

vtkImagingMath-8.0-gd.lib

vtkImagingMorphological-8.0-gd.lib

vtkImagingSources-8.0-gd.lib

vtkImagingStatistics-8.0-gd.lib

vtkImagingStencil-8.0-gd.lib

vtkInfovisCore-8.0-gd.lib

vtkInfovisLayout-8.0-gd.lib

vtkInteractionImage-8.0-gd.lib

vtkInteractionStyle-8.0-gd.lib

vtkInteractionWidgets-8.0-gd.lib

vtkIOAMR-8.0-gd.lib

vtkIOCore-8.0-gd.lib

vtkIOEnSight-8.0-gd.lib

vtkIOExodus-8.0-gd.lib

vtkIOExport-8.0-gd.lib

vtkIOExportOpenGL-8.0-gd.lib

vtkIOGeometry-8.0-gd.lib

vtkIOImage-8.0-gd.lib

vtkIOImport-8.0-gd.lib

vtkIOInfovis-8.0-gd.lib

vtkIOLegacy-8.0-gd.lib

vtkIOLSDyna-8.0-gd.lib

vtkIOMINC-8.0-gd.lib

vtkIOMovie-8.0-gd.lib

vtkIONetCDF-8.0-gd.lib

vtkIOParallel-8.0-gd.lib

vtkIOParallelXML-8.0-gd.lib

vtkIOPLY-8.0-gd.lib

vtkIOSQL-8.0-gd.lib

vtkIOTecplotTable-8.0-gd.lib

vtkIOVideo-8.0-gd.lib

vtkIOXML-8.0-gd.lib

vtkIOXMLParser-8.0-gd.lib

vtkjpeg-8.0-gd.lib

vtkjsoncpp-8.0-gd.lib

vtklibharu-8.0-gd.lib

vtklibxml2-8.0-gd.lib

vtklz4-8.0-gd.lib

vtkmetaio-8.0-gd.lib

vtkNetCDF-8.0-gd.lib

vtknetcdf_c+±gd.lib

vtkoggtheora-8.0-gd.lib

vtkParallelCore-8.0-gd.lib

vtkpng-8.0-gd.lib

vtkproj4-8.0-gd.lib

vtkRenderingAnnotation-8.0-gd.lib

vtkRenderingContext2D-8.0-gd.lib

vtkRenderingContextOpenGL-8.0-gd.lib

vtkRenderingCore-8.0-gd.lib

vtkRenderingFreeType-8.0-gd.lib

vtkRenderingGL2PS-8.0-gd.lib

vtkRenderingImage-8.0-gd.lib

vtkRenderingLabel-8.0-gd.lib

vtkRenderingLIC-8.0-gd.lib

vtkRenderingLOD-8.0-gd.lib

vtkRenderingOpenGL-8.0-gd.lib

vtkRenderingVolume-8.0-gd.lib

vtkRenderingVolumeOpenGL-8.0-gd.lib

vtksqlite-8.0-gd.lib

vtksys-8.0-gd.lib

vtktiff-8.0-gd.lib

vtkverdict-8.0-gd.lib

vtkViewsContext2D-8.0-gd.lib

vtkViewsCore-8.0-gd.lib

vtkViewsInfovis-8.0-gd.lib

vtkzlib-8.0-gd.lib

libboost_atomic-vc140-mt-gd-1_64.lib

libboost_bzip2-vc140-mt-gd-1_64.lib

libboost_chrono-vc140-mt-gd-1_64.lib

libboost_container-vc140-mt-gd-1_64.lib

libboost_context-vc140-mt-gd-1_64.lib

libboost_coroutine-vc140-mt-gd-1_64.lib

libboost_date_time-vc140-mt-gd-1_64.lib

libboost_exception-vc140-mt-gd-1_64.lib

libboost_fiber-vc140-mt-gd-1_64.lib

libboost_filesystem-vc140-mt-gd-1_64.lib

libboost_graph-vc140-mt-gd-1_64.lib

libboost_graph_parallel-vc140-mt-gd-1_64.lib

libboost_iostreams-vc140-mt-gd-1_64.lib

libboost_locale-vc140-mt-gd-1_64.lib

libboost_log-vc140-mt-gd-1_64.lib

libboost_log_setup-vc140-mt-gd-1_64.lib

libboost_math_c99-vc140-mt-gd-1_64.lib

libboost_math_c99f-vc140-mt-gd-1_64.lib

libboost_math_c99l-vc140-mt-gd-1_64.lib

libboost_math_tr1-vc140-mt-gd-1_64.lib

libboost_math_tr1f-vc140-mt-gd-1_64.lib

libboost_math_tr1l-vc140-mt-gd-1_64.lib

libboost_mpi-vc140-mt-gd-1_64.lib

libboost_numpy-vc140-mt-gd-1_64.lib

libboost_numpy3-vc140-mt-gd-1_64.lib

libboost_prg_exec_monitor-vc140-mt-gd-1_64.lib

libboost_program_options-vc140-mt-gd-1_64.lib

libboost_python-vc140-mt-gd-1_64.lib

libboost_python3-vc140-mt-gd-1_64.lib

libboost_random-vc140-mt-gd-1_64.lib

libboost_regex-vc140-mt-gd-1_64.lib

libboost_serialization-vc140-mt-gd-1_64.lib

libboost_signals-vc140-mt-gd-1_64.lib

libboost_system-vc140-mt-gd-1_64.lib

libboost_test_exec_monitor-vc140-mt-gd-1_64.lib

libboost_thread-vc140-mt-gd-1_64.lib

libboost_timer-vc140-mt-gd-1_64.lib

libboost_type_erasure-vc140-mt-gd-1_64.lib

libboost_unit_test_framework-vc140-mt-gd-1_64.lib

libboost_wave-vc140-mt-gd-1_64.lib

libboost_wserialization-vc140-mt-gd-1_64.lib

libboost_zlib-vc140-mt-gd-1_64.lib

opengl32.lib

3.2Release下配置

按3.1Debug下相同步骤配置,只需将相应依赖库改成debug的依赖库。

另,一个个复制粘贴.lib静态链接库名添加到附加依赖项甚是麻烦,这里介绍一种提取文件夹中.lib文件名的方法:

1.win+r,输入cmd回车

2.输入:cd C:\pcl1.8.1\PCL1.8.1\3rdParty\Boost\lib 回车(要得到所有的.lib,只需修改不同.lib的所在路径)

注意:这里路径如果不在C盘,例如在D盘,则需输入:cd /d D:\pcl1.8.1\PCL1.8.1\3rdParty\Boost\lib

3.分别输入:dir /b *.lib > filename.txt

                 dir /b *debug.lib > filename_debug.txt

                 dir /b *-gd*.lib > filename_gd.txt

                 dir /b *_d*.lib > filename_d.txt

                 dir /b *release.lib > filename_release.txt

可以得到各类型的静态库。这里要注意,如果文件名中间也包含了debug、-gd、_d或者release的字样,生成的txt里可能会多添加了本不该加的.lib。总之,生成完之后,要检查下txt里内容是否正确。

在这里,我们只需要使用中间三个,来得到debug下的.lib静态库。filenamexxx.txt是生成的文件名,可以自定义。

将生成的各txt归到一个txt里,就是我们要添加的附加依赖项的内容了。

4.验证测试程序

  1. 第一个测试程序:

将bunny.pcd(百度云盘链接如下)放到与程序main.cpp同一位置的文件夹下,如图PCLTest(自命名)文件夹下。
在这里插入图片描述
https://pan.baidu.com/s/1sJYz1QVZ09YSdKSmUos7fQ

#include<pcl/visualization/cloud_viewer.h>
#include<iostream>//标准C++库中的输入输出类相关头文件。
#include<pcl/io/io.h>
#include<pcl/io/pcd_io.h>//pcd 读写类相关的头文件。
#include<pcl/io/ply_io.h>
#include<pcl/point_types.h> //PCL中支持的点类型头文件。
int user_data;
using std::cout;
 
 
void viewerOneOff(pcl::visualization::PCLVisualizer& viewer)
{
	viewer.setBackgroundColor(1.0, 0.5, 1.0);   //设置背景颜色
}
 
int main()
{
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
 
	char strfilepath[256] = "rabbit.pcd";
	if (-1 == pcl::io::loadPCDFile(strfilepath, *cloud)){
		cout << "error input!" << endl;
		return -1;
	}
	
	cout << cloud->points.size() << endl;
	pcl::visualization::CloudViewer viewer("Cloud Viewer");     //创建viewer对象
	
	viewer.showCloud(cloud);
	viewer.runOnVisualizationThreadOnce(viewerOneOff);	
	system("pause");
	return 0;
}

程序运行结果:
在这里插入图片描述

  1. 第二个测试程序:
 #include<iostream>  
#include<pcl/io/pcd_io.h>  
#include<pcl/point_types.h> 
#include<pcl/ModelCoefficients.h>  
#include<pcl/filters/project_inliers.h>    
int main(int argc, char** argv)  
{      
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);      
    pcl::PointCloud<pcl::PointXYZ>::Ptr cloud_projected(new          pcl::PointCloud<pcl::PointXYZ>);       
    cloud->width = 5;      
    cloud->height = 1;      
    cloud->points.resize(cloud->width * cloud->height);        
    for (size_t i = 0; i < cloud->points.size(); ++i)      
    {          
        cloud->points[i].x = 1024 * rand() / (RAND_MAX + 1.0f);          
        cloud->points[i].y = 1024 * rand() / (RAND_MAX + 1.0f);          
        cloud->points[i].z = 1024 * rand() / (RAND_MAX + 1.0f);      
    }        
    std::cerr << "Cloud before projection: " << std::endl;      
    for (size_t i = 0; i < cloud->points.size(); ++i)          
        std::cerr << "    " << cloud->points[i].x << " "          << 
        cloud->points[i].y << " "          << cloud->points[i].z << std::endl; 

    // Create a set of planar coefficients with X=Y=0,Z=1      
    pcl::ModelCoefficients::Ptr coefficients(new pcl::ModelCoefficients());      
    coefficients->values.resize(4);      
    coefficients->values[0] = coefficients->values[1] = 0;      
    coefficients->values[2] = 1.0;      
    coefficients->values[3] = 0;    

    // Create the filtering object      
    pcl::ProjectInliers<pcl::PointXYZ> proj;      
    proj.setModelType(pcl::SACMODEL_PLANE);      
    proj.setInputCloud(cloud);      
    proj.setModelCoefficients(coefficients);      
    proj.filter(*cloud_projected);       
    std::cerr << "Cloud after projection: " << std::endl;      
    for (size_t i = 0; i < cloud_projected->points.size(); ++i)          
        std::cerr << "    " << cloud_projected->points[i].x << " "          <<
        cloud_projected->points[i].y << " "          << cloud_projected->points[i].z << std::endl;
    system("pause");      
    return (0);  
}

输出显示:
在这里插入图片描述

5.配置出现的一些问题总结

1.提示缺少xxx.dll
解决办法:配置dll有四种方法,第一种,把dll拷贝到system32里去,第二种,把dll拷贝到编译出来的程序的文件中,第三种,在系统的path中添加dll的路径,本文选用第四种方法,直接配置到项目中。具体方法如下:
在“解决方案资源管理器”里选中项目右键点“属性”,然后选“调试”设置环境的变量值,规则如下:

PATH=;$(PATH)

在等号后添加所有PCL及第三方库的dll路径以英文的“;”隔开,最后加上一个 ( P A T H ) 即 可 。 例 如 我 设 置 的 如 下 : P A T H = (PATH)即可。 例如我设置的如下: PATH= (PATH)PATH=(PCL_ROOT)\bin;KaTeX parse error: Expected 'EOF', got '\3' at position 11: (PCL_ROOT)\̲3̲rdParty\FLANN\b…(PCL_ROOT)\3rdParty\VTK\bin;KaTeX parse error: Expected 'EOF', got '\Qhull' at position 11: (PCL_ROOT)\̲Q̲h̲u̲l̲l̲\bin;(PCL_ROOT)\3rdParty\OpenNI2\Tools;$(PATH)
大家根据自己的安装路径,灵活变通。

2.提示缺少xxx.h等头文件
解决办法:这个问题是因为在设置include,即设置附加包含目录,路径不对或缺少导致的。根据提示,检查下项目的属性,C/C+±>常规->附加包含目录里,找到对应错误的库的头文件路径,修改或添加其所在文件夹的路径。

3.提示无法解析的外部符号错误
解决方法:这个问题比较难解决,总结起来有四大原因:安装包版本不对、项目的位数和PCL库的位数不对、缺少对应的lib、函数只有声明,没有定义。第一个找对安装包即可,第二个修改项目位数和PCL库的位数一致即可,第三个要根据经验去添加上lib文件,第四个的话,在预处理器里添加PCL_NO_PRECOMPILE即可,当然上面只是经验之谈,要根据实际情况做出调整。

4.提示无法打开xxx.lib
解决方法:一是检查你PCL安装路径下有没有这个lib,如果没有,那就在附加依赖项里把这个lib删除,如果有,则进行第二个检查。二是检查下项目的属性,链接器->附加包含目录,有没有添加上这个lib所在文件夹的路径。

5.出现错误代码为C4996的错误
解决办法:这个错误一般是通过在项目属性的C/C+±>预处理器->预处理定义里,添加对应的定义来解决。这里给出一个“一劳永逸”的方法,在C/C+±>常规->SDL检查里的值设置为“否 (/sdl-)”。

6.出现无法定位于动态链接库的错误
解决方法:查看下系统环境变量PATH里是否有多个不同版本PCL及相关库的路径,去掉不使用的路径。

7.提示无法打开stdafx.h
解决办法:默认新建的控制台程序,包含mian函数的cpp里会包含这个头文件,而在拷贝代码时,没注意,把这个包含头文件删除了,只要在包含头文件里重新添加上#include “stdafx.h”就可以了,注意要加在所有include的最上面。

8.在Debug下编译会出现大量的warning(Release下没有):

warning LNK4099: 未找到 PDB“.pdb”正在链接对象,如同没有调试信息一样

解决方法:“视图”->“解决方案资源管理器”->“属性”->“链接器"->“调试”,在右侧的“生成调试信息”改为“否”,确定即可。

具体原因涉及到release和debug的区别,以及PDB文件,具体可百度了解。

9.在属性目录"C/C++ "– >“预处理器”–>“预处理器定义” 加入:

_SCL_SECURE_NO_WARNINGS
_CRT_SECURE_NO_WARNINGS
PCL_NO_PRECOMPILE

10.error C4996: ‘pcl::SAC_SAMPLE_SIZE’: This map is deprecated and is kept only to prevent breaking existing user…

解决方法:“视图”->“解决方案资源管理器”->“属性”->“C/C++”->“SDL检查”:改为否(/sdl)
在这里插入图片描述
11.如果遇到vtk相关报错
在这里插入图片描述
#include

VTK_MODULE_INIT(vtkRenderingOpenGL);

VTK_MODULE_INIT(vtkInteractionStyle);

说明:下次打开一个新的vs工程,如何添加保存好的属性表?

. 点击“视图”->“其他窗口”->“属性管理器”,在Debug | x64上右键单击,选择“添加现有属性表”,选择之前目录下的属性文件;

  • 0
    点赞
  • 22
    收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论 1

打赏作者

洞庭渔人

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值