PCL配置即常见问题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PCL配置即常见问题
1 下载
把与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包。
2 安装
整个安装过程需要注意以下三点,其它默认即可:
1. 安装路径最好不要包括中⽂;
2. 建议勾选上“AddPCLtothesystemPATHforallusers”;
3. 安装时,会提⽰安装OpenNI,这个建议安装在PCL安装路径的3rdParty下的OpenNI2⽂件夹中。
3 新建
⼀般在VS⾥创建⼀个C++的控制台项⽬,根据⾃⼰的意愿设置⼀下项⽬名和路径。
在新建过程中注意以下两点,其它默认即可:
1. 去掉“预编译头(P)”前的勾
2. 去掉“安全开发⽣命周期(SDL)检查(C)”前的勾。
4 配置
在配置项⽬属性环节,需要了解的是编译出来的程序分为两种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。
选中其中⼀项,右键点击“添加新项⽬属性表”,在弹出的对话框⾥设置好对应的属性表名和路径。
确认之后,在该项中就会多出⼀项以刚才属性表名为名称的属性表。
在新建的属性表⾥,有三个必须设置的重要项⽬:附加包含⽬录,附加库⽬录,附加依赖项。
1. 附加包含⽬录,其在项⽬属性“C/C++”⼦项的“常规”⾥下,主要⽤来设置库的头⽂件路径。
这⾥设置好PCL及第三⽅库的头⽂件路径。
2. 附加库⽬录,其在项⽬属性的“连接器”⼦项的“常规”下,主要⽤来设置库的lib⽂件路径。
这⾥设置好设置PCL及第三⽅库的lib⽂件路径。
3. 附加依赖项,其在项⽬属性的“连接器”⼦项的“输⼊”下,主要⽤来设置编译所需的lib。
这⾥设置好设置PCL及第三⽅库的lib⽂件名。
只有理解⾥上⾯这三项的作⽤,才能学到如何去解决配置中产⽣的⼀些问题。
在配置完属性表后,还需要配置dll。
配置dll有四种⽅法,第⼀种,把dll拷贝到system32⾥去,第⼆种,把dll拷贝到编译出来的程序的⽂件中,第三种,在系统的path中添加dll的路径,本⽂选⽤第四种⽅法,直接配置到项⽬中。
具体⽅法如下:
在“解决⽅案资源管理器”⾥选中项⽬右键点“属性”,然后选“调试”设置环境的变量值,规则如下:
PATH=;$(PATH)
在等号后添加所有PCL及第三⽅库的dll路径以英⽂的“;”隔开,最后加上⼀个$(PATH)即可。
例如我设置的如下:
PATH=$(PCL_ROOT)\bin;$(PCL_ROOT)\3rdParty\FLANN\bin;$(PCL_ROOT)\3rdParty\VTK\bin;$(PCL_ROOT)\Qhull\bin;$(PCL_ROOT)\3rdParty\OpenNI2\Tools;$(PATH)⼤家根据⾃⼰的安装路径,灵活变通。
5 开发
完成上述步骤后,就可以把代码拷贝到新建⽴的项⽬的cpp⽂件中去,然后编译,运⾏。
测试⼀下是否运⾏成功。
测试代码如下。
#include <pcl/visualization/cloud_viewer.h>
#include <iostream>
#include <pcl/io/io.h>
#include <pcl/io/pcd_io.h>
int user_data;
void
viewerOneOff (pcl::visualization::PCLVisualizer& viewer)
{
viewer.setBackgroundColor (1.0, 0.5, 1.0);
pcl::PointXYZ o;
o.x = 1.0;
o.y = 0;
o.z = 0;
viewer.addSphere (o, 0.25, "sphere", 0);
std::cout << "i only run once" << std::endl;
}
void
viewerPsycho (pcl::visualization::PCLVisualizer& viewer)
{
static unsigned count = 0;
std::stringstream ss;
ss << "Once per viewer loop: " << count++;
viewer.removeShape ("text", 0);
viewer.addText (ss.str(), 200, 300, "text", 0);
//FIXME: possible race condition here:
user_data++;
}
int
main ()
{
pcl::PointCloud<pcl::PointXYZRGBA>::Ptr cloud (new pcl::PointCloud<pcl::PointXYZRGBA>); pcl::io::loadPCDFile ("my_point_cloud.pcd", *cloud);
pcl::visualization::CloudViewer viewer("Cloud Viewer");
//blocks until the cloud is actually rendered
viewer.showCloud(cloud);
//use the following functions to get access to the underlying more advanced/powerful
//PCLVisualizer
//This will only get called once
viewer.runOnVisualizationThreadOnce (viewerOneOff);
//This will get called once per visualization iteration
viewer.runOnVisualizationThread (viewerPsycho);
while (!viewer.wasStopped ())
{
//you can also do cool processing here
//FIXME: Note that this is running in a separate thread from viewerPsycho
//and you should guard against race conditions yourself...
user_data++;
}
return 0;
}
6 常见问题
配置PCL的过程是⽐较复杂的,需要根据⾃⼰的情况灵活调整。
下⾯就配置过程中可能会遇到的典型问题,给出其解决⽅案。
1. 找不到xxx.h
这个问题是因为在设置include,即设置附加包含⽬录,路径不对或缺少导致的,根据提⽰,找到对应错误的库的头⽂件路径,更该即可。
1. 找不到xxx.lib
这个问题和上⼀个问题很像,是附加库⽬录中,路径不对或缺少导致的,根据提⽰,修改对应的路径即可。
注意:如果设置了,还是提⽰找不到头⽂件或lib,这时就要查看⼀下PCL的安装路径下有没有这个头⽂件或lib,如果有,说明你的路径设置的还是有问题,如果搜索不到这个头⽂件,那就要修改代码,可能是版本原因导致这个头⽂件没了,如果搜索不到lib⽂件,那么把这个lib从附加依赖项⾥删除。
1. ⽆法解析的外部符号
这个问题⽐较难解决,总结起来有四⼤原因:
安装包版本不对
项⽬的位数和PCL库的位数不对
缺少对应的lib
只有声明,没有定义
第⼀个找对安装包即可,第⼆个修改项⽬位数和PCL库的位数⼀致即可,第三个要根据经验去添加上lib⽂件,第四个的话,在预处理器⾥添加PCL_NO_PRECOMPILE即可,当然上⾯只是经验之谈,要根据实际情况做出调整。
2.
问题描述
error C4996: ‘std::_Uninitialized_copy0’: Function call with parameters that may be unsafe - this call relies on the caller to check that the passed values are correct. To disable this warning, use -D_SCL_SECURE_NO_WARNINGS. See documentation on how to use Visual C++ ‘Checked Iterators’ d:\program files\microsoft visual studio 12.0\vc\include\xmemory 348 1 test2
解决⽅法
右键⼯程名,进⼊⼯程属性页,依次选中:
编辑【预处理定义】,如错误提⽰所说,添加,_SCL_SECURE_NO_WARNINGS:。