1前言:
本文介绍2022下Vs运用开源3D视觉库PCL的方法,希望对利用Vs+C++开发的开源库利用的设计者有帮助。
Point Cloud Library (PCL) 本身比较复杂,本文阐述用Vs2022 为编译平台,将PCL库编译并连接到项目的主要设定和遇到的问题:
PCL能解决,遇到其他的库,都不是事。
- 难点1:
- PCL 包含很多第三方库,本身头文件组织比较复杂。
- PCL自己文件组织里面难免疏漏,出现里面版本倾轧的问题,变成了编译里面的workrun门槛。

讯享网 - 难点2
- 使用PCL的时候,往往希望使用它已经编译好的库,这样和你自己项目本身的平台配合难免出现各种版本问题。
2 项目编译环境介绍:
Visual Station 2022
PCL:1.12.1
编译:Debug版本
Windows10系统 64位
3 利用已经编译好的all-in-one库:
PCL也支持用源码进行编译的方式,这篇博文,由于项目时间比紧张,还是采用利用已经编译好的库进行,同时,本文文末贴出了源码编译加入项目的方法。
3.1 PCL 的windows版本获取方法1:vcpkg
PCL 下载版本说明 里面,PCL 感觉对Linux的支持更顺畅:
对Windows的推荐方法为:

3.2 PCL 的windows版本获取方法2:github
Releases pcl-1.12.1

【案,不过这个名字是MSVC2019,亲测验证,MSVC2022也是可以用的】
4 完全从源码编译PCL库:
5 集成遇到的坑和问题:
5.1 PCL头文件的workrun的巨大的坑,搞了很久
#include <pcl/io/pcd_io.h> vs #include <pcl/io/io.h>
这是最头疼的问题,因为是PCL本身的问题,开始设置的时候,报了3000+的错误,大部分都是因为应用了io.h而不是pcd_io.h的原因,难道是因为我最终用了pcd的部分,这部分没有验证,启动读者反馈。
5.2 编译all-in-one vtk
5.2.1 头文件级层目录问题
编译头文件的加入方式,这个也是所有的vs开源库集成需要注意的地方。
这个错误是因为:包含文件的目录结构,搜寻是从上到下的,你需要在VS中,设定这vtk-9.1这个目录的上一级目录:

- 不完备的设定

- 【解决办法】完备的设定

5.2.2 库连接问题:
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 LNK2019 无法解析的外部符号 “__declspec(dllimport) public: __cdecl vtkObjectFactoryRegistryCleanup::~vtkObjectFactoryRegistryCleanup(void)” (_imp??1vtkObjectFactoryRegistryCleanup@@QEAA@XZ),函数 “void __cdecl `dynamic atexit destructor for ‘vtkObjectFactoryRegistryCleanupInstance’'(void)” (??__FvtkObjectFactoryRegistryCleanupInstance@@YAXXZ) 中引用了该符号 PointCloudDemo D:\BaiduNetdiskWorkspace\DimensionXworks\3Dcamera\CloudPiontDemo\PointCloudDemo\PointCloudDemo.obj 1
5.2.2.1 将需要链接的库加入VS的配置里面:
笔者参考一篇很棒的博客,在文末大家可以去按一下:

我们要做的就是把下面的库都给贴进上面这个对话框:
【案,不知道有没有其他办法,但是,这有近百个库,如果要一个一个区别是debug版本还是release,版本,然后再逐一贴入项目的话,我觉得我可以想象一下,我要石化了。此时此刻,我FFFFFFF,好在文末参考博文里面给出了一个有效可行的办法】
【该方法可以适用于,所有利用开源项目来编译大小软件的兄弟,所以,文末我贴出了侠客的博文,我这里也重新组织了一下】
我们现在假设,要交叉链接下面两个DEBUG库群【因为库实在多】
- D:\PCL1121\lib
- D:\PCL1121\3rdParty\VTK\lib
5.2.2.2 因为Vs项目编译有debug,release部分,所以,要找个办法,把这些库都区分开来
5.2.2.2.1 首先用dos命令把文件pcl和vtk的库名抓出来:
cd /d D:\programming\PCL 1.11.0\lib dir /b *.lib *>0.txt cd D:\PCL1121\3rdParty\VTK\lib dir /b *.lib *>0.txt
讯享网
vtkcgns-9.1.lib
vtkcgns-9.1d.lib
vtkChartsCore-9.1.lib
vtkChartsCore-9.1d.lib
vtkCommonColor-9.1.lib
vtkCommonColor-9.1d.lib
vtkCommonComputationalGeometry-9.1.lib
vtkCommonComputationalGeometry-9.1d.lib
vtkCommonCore-9.1.lib
vtkCommonCore-9.1d.lib
vtkCommonDataModel-9.1.lib
vtkCommonDataModel-9.1d.lib
vtkCommonExecutionModel-9.1.lib
vtkCommonExecutionModel-9.1d.lib
vtkCommonMath-9.1.lib
vtkCommonMath-9.1d.lib
vtkCommonMisc-9.1.lib
vtkCommonMisc-9.1d.lib
…
把两个结果,抱歉手动copy到一个文件里面,去掉一些错误的加入项,
5.2.2.2.2 用python分开
然后,因为release和debug两个文件是成对的,我们可以用下面的python代码区分一下:

讯享网import numpy as np file = open('0.txt', 'r') i = 0 releaseTxt = [] debugTxt = [] while 1: line = file.readline() line = str(line).replace('\n', '') if not line: break if i%2 == 0: releaseTxt.append(line) else: debugTxt.append(line) i = i + 1 file.close() de = np.array(debugTxt) np.savetxt('debug.txt', de, fmt="%s", delimiter="") re = np.array(releaseTxt) np.savetxt('release.txt', re, fmt="%s", delimiter="")
5.2.2.2.3 用python环境执行上面这个命令
我是用jupter的环境,把上代码存成文件,file_lib_arrange.py

(base) PS D:\ProgramData\Anaconda3> .\python.exe .\file_lib_arrange.py
5.3 动态库找不到问题:
PCL编译到项目里面去的时候,有一些库是以动态库方式,这些库加入项目的方法有两个。
5.3.1 问题
找不到vtkCommonCore-91d.dll

5.3.2 【解决办法1】在环境变量里面设定系统的动态库的路径:
5.3.3 【解决办法2】直接copy到项目根目录
【案,笔者实验3.2的方法无效,也许需重新启动,所以,先按3.3的搞一下,亲测可以】

5.4 pcl项目文编译问题:
5.4.1 项目文件太大
严重性 代码 说明 项目 文件 行 禁止显示状态
错误 C1128 节数超过对象文件格式限制: 请使用 /bigobj 进行编译 PointCloudDemo D:\BaiduNetdiskWorkspace\DimensionXworks\3Dcamera\CloudPiontDemo\PointCloudDemo\PointCloudDemo.cpp 1
在 Visual Studio 开发环境中设置此编译器选项
打开项目的“属性页” 对话框。 有关详细信息,请参阅在 Visual Studio 中设置 C++ 编译器和生成属性。
选择“配置属性”>“C/C++”>“命令行”属性页。
在“附加选项”框中输入 /bigobj 编译器选项
5.4.2 项目警告级别的设定问题
5.4.2.1 C4700变量没有初始化
【案,这个没有初始化的错误,也许可以通过降低为警告的方式处理掉,但是,因为笔者项目时间原因,初始化变量不多,通过手动赋值为0可以解决,例如float a=0;就好了】
5.4.2.2 C4996报错信息屏蔽
一些warning会被编译器默认为错误,这导致PCL的链接出问题,这个问题C4996应该对项目的使用么有大的影响:
通过禁用这个特定的警告可以避这个错误。

5.4.3 dll的库找不到,
dll的动态链接库,是PCL编译项目的重要一环,
5.4.3.1 编入动态库路径
5.4.3.1.1 找不到pcl_commond.dll



笔者,为了求快,把动态库全部copy到项目根目录了,这样也就避免了设定的环节。
5.4.3.2 找不到openNI2.dll

OpenNI2的安装的特殊,因为 PCL第三方库给出的是一个windows安装的mis程序,安装完后,需copy安装的动态库到指定动态库目录:
命令行执行文件调试技巧:
命令行参数的输入:
如果设定的命令行需要输入参数,例如PCL的输入需要参数,我们如何设定断点进行跟踪?
例如,我的程序计算某个参数,需要用我的命令行参数:
[命令] + -a + [后续参数]

我们再Vs里面这样些就好了。
5.4.4 命令行CMD打印不能正常输出:
CMD的命令行程打印的重要原因,笔者是遇到了OpenNI2带了的附加问题,也就是如果某个库没有安装顺利,最终也会影响系统调试输出信息。
小结:
参考:
特别感谢重要参考:
点云处理c++库——pcl安装




版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/116686.html