Visual Studio+PCL环境配置及各步骤意义简介
介绍VS+PCL的配置步骤,希望可以给小白简介下要怎么配置以及为什么这样位置
一、简介
pcl是应用最广泛的点云处理库之一,使用pcl也是进行相关领域科研或者找相关工作必备的一个技能点。pcl的配置方法网上一抓一大把,回想我大四最开始接触点云的时候,也是照搬博客里的操作一步一步完成了配置,但很多步骤是在做什么其实都不懂。现在是研一下,这段时间也做了一些小项目,学了一些新操作,也大概能理解这些步骤到底是在做什么。写这篇文章的目的就是给跟我一样在配置pcl时候知其然又想知其所以然的编程小白做一些普及,说不定哪句内容就会解答你之前的一个疑惑(内容很浅显,大佬请绕道)
并且本文废话比较多,如果只是想完成配置,可以看下面的博客:Windows + VS2022超详细点云库(PCL)配置
二、准备工作
2.1 安装PCL 1.11.1
首先进入https://github.com/PointCloudLibrary/pcl/releases,到2023年5月18日,PCL已经更新到了1.13.1版本,并且还有人在持续维护,这种我就很喜欢:) ,关于PCL版本的选择,我的建议是先选1.11及以前的
。因为1.12中对一个点云数据结构进行了更改,如果你用了这个版本,就会惊奇的发现网上大部分的教程运行起来会报内存错误,这肯定不适合刚入门的来折腾,所以干脆直接安低版本的吧~
以1.11.1版本为例,github上的发行包长成这样子
需要关注这几个文件
- AllInOne.exe:这个文件可以安装pcl以及其第三方依赖库。需要注意,文件名中包含
msvc2019
,代表这个版本的库是使用msvc2019版本的编译器编译的,由于不同版本的编译器的输出结果可能有不兼容,所以我们要安装和这个编译器版本匹配的Visual Studio版本,自然接下来我们要安装Visual Studio 2019。 - pdb.zip:后面我们可以看到,AllInOne的安装结果是一堆dll库,如果某天你对某个pcl模块的内部实现非常感兴趣,想起了C语言老师的教导“要记得使用单步调试来学习代码”,你就会惊奇的发现,pcl的函数没有办法调试进入,问题可能就出在你没有安装pdb。
- pdb是Progam Debug DataBase,显然他是一个与debug有关的文件,会在编译dll的同时生成 。
- pdb通常会用在协作开发中,A封装了A.dll,B封装了B.dll,如果发布的应用程序出现了未知错误,运行程序崩溃时生成的dump文件,配合A和B提供的pdb文件,就可以很快定位到究竟是谁写的哪行代码出现了bug,这时候主管就会找你来追责啦:)。如果没有这文件,那就只能凭客户的描述来猜究竟是哪里出了问题,效率很低。
- 但好像有了pdb文件就可以反编译了,所以要注意只能在内部使用噢
- Source code:这里是PCL的源码。如果你需要换一个编译器,这时候就要对源码进行编译了,这部分怎么搞之后再说。
记得添加环境变量
安装完成后的文件结构如下
- 3rdParty中包含PCL的依赖库,其中最重要的几个
- Boost(必须):PCL中使用了boost中的共享指针和线程操作
- Eigen(必须): 方便的进行矩阵运算
- FLANN(必须):用来实现点云处理中的重要步骤——K近邻搜索
- VTK(必须):用于点云的渲染和可视化
- bin文件夹中是构建生成的一些文件,包含例程的可执行文件以及一堆dll库,注意这里有两种dll库,一种是用于Debug模式文件名以d结尾,另一种是用于Release版本,这个后边配置的时候要注意与使用的模式相匹配。
- cmake:我们因为不使用cmakelist,所以这部分可以先不用关注
- include文件夹里是dll对应的头文件
- lib是dll库的引入库,这部分之后会详细说明
- share里是相关文档
将pdb压缩文件解压到bin文件夹下,与dll文件放到一起
2.2 安装Visual Studio 2019
刚才提到了,我们选择的PCL版本是1.11.1,官方使用了msvc2019编译器预先对源码进行了编译以方便开发者的使用,所以我们安装VS 2019来避免一些未知错误,这个安装方法更是一抓一大把,也没啥内容,你奶奶来了都能安上,我就不写了。
说句题外话,网友总是会对哪种编译器更好产生争论,这个我认为duck不必,用的顺手比啥都强。但对于初学者,我非常建议直接使用Visual Studio来进行开发,虽然其总因为巨大的体量和复杂的工程被广大程序员看不起,但的的的确确确可以减少很多配置步骤,并且功能齐全。咱还是把时间花到刀刃上,别纠结咋配置环境了吧:)
三、配置方法
- 创建一个新工程
- 右键工程名,点击最下边的属性(Properties)
- 修改最上方模式,我这里选择的是
Release
和x64
- 选择Configuration Properties–>VC++ Directories
- 修改Include Directories,指定这个是为了编译器可以找到我们#include的头文件,因此我们需要在这里添加pcl以及第三方依赖库的头文件路径,一般会放在include文件夹中,以我的路径为例,需要添加以下路径,需要结合自己的路径进行修改
D:\PCL1.11.1\PCL 1.11.1\include\pcl-1.11
D:\PCL1.11.1\PCL 1.11.1\3rdParty\Boost\include\boost-1_74
D:\PCL1.11.1\PCL 1.11.1\3rdParty\Eigen\eigen3
D:\PCL1.11.1\PCL 1.11.1\3rdParty\FLANN\include
D:\PCL1.11.1\PCL 1.11.1\3rdParty\VTK\include\vtk-8.2
D:\PCL1.11.1\PCL 1.11.1\3rdParty\OpenNI2\Include
- 修改Library Directories, 指定这个是为了编译器可以找到dll的引入库,注意Eigen因为是纯模板库,所以不需要指定(TODO:这个模板库是咋回事现在还没太搞懂)
D:\PCL1.11.1\PCL 1.11.1\lib
D:\PCL1.11.1\PCL 1.11.1\3rdParty\Boost\lib
D:\PCL1.11.1\PCL 1.11.1\3rdParty\FLANN\lib
D:\PCL1.11.1\PCL 1.11.1\3rdParty\VTK\lib
D:\PCL1.11.1\PCL 1.11.1\3rdParty\OpenNI2\Lib
- 选择Configuration Properties–>Linker->Input
注意:debug模式和release模式下需要加入的lib不同,一般来说结尾带有gd、d字样的是用与debug模式的lib,什么都没写的是用于release的,rd则代表debug和release都可(这个是从别人的博客看见的,我倒是没试过rd是不是两种模式都可以)。比如pcl_common.lib
和pcl_commond.lib
,vtkChartsCore-8.2-gd.lib
和vtkChartsCore-8.2.lib
我这里写了一个不太优雅的脚本文件来提取文件名,大家如果不嫌弃可以一用:
在下图目录下新建get.txt文件,写入以下内容:
cd ./lib
DIR *.lib /B >../liblist.txt
cd ../3rdParty/VTK/lib
DIR *.lib /B >>../../../liblist.txt
cd ../../../
findstr /e "d.lib" liblist.txt >debug_lib.txt
findstr /e /v "d.lib" liblist.txt >release_lib.txt
pause
保存后将后缀改为.bat,然后双击运行,当前目录下就会出现debug_lib.txt和release_lib.txt,将里面的内容复制到对应模式下的附加依赖项中即可。
新建下面的测试文件test.cpp(网上随便搜的)
#include <iostream>
#include <pcl/common/common_headers.h>
#include <pcl/io/pcd_io.h>
#include <pcl/visualization/pcl_visualizer.h>
#include <pcl/visualization/cloud_viewer.h>
#include <pcl/console/parse.h>
int main(int argc, char** argv) {
std::cout << "Test PCL !!!" << std::endl;
pcl::PointCloud<pcl::PointXYZRGB>::Ptr point_cloud_ptr(new pcl::PointCloud<pcl::PointXYZRGB>);
uint8_t r(255), g(15), b(15);
for (float z(-1.0); z <= 1.0; z += 0.05)
{
for (float angle(0.0); angle <= 360.0; angle += 5.0)
{
pcl::PointXYZRGB point;
point.x = 0.5 * cosf(pcl::deg2rad(angle));
point.y = sinf(pcl::deg2rad(angle));
point.z = z;
uint32_t rgb = (static_cast<uint32_t>(r) << 16 |
static_cast<uint32_t>(g) << 8 | static_cast<uint32_t>(b));
point.rgb = *reinterpret_cast<float*>(&rgb);
point_cloud_ptr->points.push_back(point);
}
if (z < 0.0)
{
r -= 12;
g += 12;
}
else
{
g -= 12;
b += 12;
}
}
point_cloud_ptr->width = (int)point_cloud_ptr->points.size();
point_cloud_ptr->height = 1;
pcl::visualization::CloudViewer viewer("test");
viewer.showCloud(point_cloud_ptr);
while (!viewer.wasStopped()) {};
return 0;
}
点击运行注意运行前的模式和平台要与刚才配置的一致,否则一样会找不到头文件
正常情况会报下边的错误
提示的已经很清楚了,Properties->C/C+±>Preprocessor->Preprocessor Definitions,添加_CRT_SECURE_NO_WARNINGS
以及这个错误
这种看起来没啥大问题的错误,通常是由于开启了SDL检查导致的,微软的SDL检查会让一些警告变成错误,关闭即可,Propertie->C/C++ ->All Options->SDL checks,选择否。
修改之后再次运行,哎漂亮!还是不行
所以我们添加的lib文件里是啥东西,有点搞不懂了,还需要重新指定dll的路径
Windows下dll的搜索路径如下:
- 应用程序所在的路径;
- Windows的SYSTEM目录,如C:\Windows\System,通过调用GetSystemDirectory函数 可以获取这个目录的路径;
- Windows目录,如C:\Windows,通过调用GetWindowsDirectory函数可以获取这个目录的路径;
- PATH环境变量指定的路径。
第二个和第三个都有点离谱,把一大堆dll放进C盘就有点脑瘫,第一个要把所有dll都放到exe的相同目录下,也不是很优雅,所以我选择把库的bin文件夹路径添加到环境变量中。
在系统变量中添加PCL_ROOT,他的值是你自己的PCL路径
然后在系统变量/用户变量的Path中添加如下内容:
%PCL_ROOT%\bin
%PCL_ROOT%\3rdParty\Boost\lib
%PCL_ROOT%\3rdParty\FLANN\bin
%PCL_ROOT%\3rdParty\VTK\bin
%PCL_ROOT%\3rdParty\OpenNI2\Tools
确定后,重启电脑,等待起飞
至此配置完成。
四、结论
不管是什么编程环境配置什么库,配置过程无外乎就是这些步
- 安装库以及编程环境
- 在IDE(不严格的说法)中指定头文件路径(include),引入库路径(lib),附加依赖项(.lib)
- 确定dll路径,如果使用的dll比较少,可以直接将他移动大exe的相同路径下,如果使用的比较多,那还是在系统环境变量中指定该库的dll所在路径(通常位于bin文件夹下,但也不一定,比如OpenNI的dll就位于Tools下)
写的比较匆忙,如有遗漏还请补充
之后会补充动态库的相关内容,并且会把本文中提出的两个TODO思考一下
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)