作为最近刚接触点云的小白,在经历配置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安装过程
整个安装过程需要注意以下三点,其它默认即可:
-
安装路径最好不要包括中文;
-
建议勾选上“Add PCL to the system PATH for all users”;
-
路径中不要有任何空格,如下图系统会自动给你生成有空格的路径,你需要修改去掉空格就行,这样做的目的是如果以后用到了QT,QT是不能识别空格的路径的,所以建议这里删掉空格,当然不用QT可以忽略。
本人路径:D:\PCL1.8.1\PCL1.8.1。第二个PCL1.8.1文件夹是软件生成的,需要删掉空格。 -
安装时,会提示安装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.验证测试程序
- 第一个测试程序:
将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;
}
程序运行结果:
- 第二个测试程序:
#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路径以英文的“;”隔开,最后加上一个(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上右键单击,选择“添加现有属性表”,选择之前目录下的属性文件;