Visual Studio+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的源码。如果你需要换一个编译器,这时候就要对源码进行编译了,这部分怎么搞之后再说。

记得添加环境变量

记得修改安装路径,并记住!
安装过程中如果遇到OpenNI的问题,可以不用管,后边找到OpenNI的位置,然后单独安装到3rdParty文件夹中即可。

安装完成后的文件结构如下

  • 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来进行开发,虽然其总因为巨大的体量和复杂的工程被广大程序员看不起,但的的的确确确可以减少很多配置步骤,并且功能齐全。咱还是把时间花到刀刃上,别纠结咋配置环境了吧:)

三、配置方法

  1. 创建一个新工程
  2. 右键工程名,点击最下边的属性(Properties)
  3. 修改最上方模式,我这里选择的是Releasex64
  4. 选择Configuration Properties–>VC++ Directories
  1. 修改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
  1. 修改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
  1. 选择Configuration Properties–>Linker->Input
在附加依赖项中添加需要链接的dll的引入库,需要加入pcl和vtk lib文件夹下的内容 (TODO:boost和flann为啥不加,我没想过,挠头。。。)

注意:debug模式和release模式下需要加入的lib不同,一般来说结尾带有gd、d字样的是用与debug模式的lib,什么都没写的是用于release的,rd则代表debug和release都可(这个是从别人的博客看见的,我倒是没试过rd是不是两种模式都可以)。比如pcl_common.libpcl_commond.libvtkChartsCore-8.2-gd.libvtkChartsCore-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思考一下

猜你喜欢

转载自blog.csdn.net/weixin_44368569/article/details/130741781
今日推荐