【C++基础】【集成编译环境03】【3D视觉】Visual Station 2022 项目集成【1】 Point Cloud Library (PCL)库的项目集成和遇到的坑

1前言:

本文介绍2022下Vs运用开源3D视觉库PCL的方法,希望对利用Vs+C++开发的开源库利用的设计者有帮助。
Point Cloud Library (PCL) 本身比较复杂,本文阐述用Vs2022 为编译平台,将PCL库编译并连接到项目的主要设定和遇到的问题:
PCL能解决,遇到其他的库,都不是事。

  • 难点1:

  • PCL 包含很多第三方库,本身头文件组织比较复杂。

  • PCL自己文件组织里面难免疏漏,出现里面版本倾轧的问题,变成了编译里面的workrun门槛。
    PCL 目录

  • 难点2

  • 使用PCL的时候,往往希望使用它已经编译好的库,这样和你自己项目本身的平台配合难免出现各种版本问题。
    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
PCL库
【案,不过这个名字是MSVC2019,亲测验证,MSVC2022也是可以用的】

4 完全从源码编译PCL库:

Compiling PCL from source on Windows
我贴一下链接如上,有需要的可以参考:


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开源库集成需要注意的地方。

严重性 代码 说明 项目 文件 行 禁止显示状态
错误(活动) E1696 无法打开 源 文件 “vtk-9.1/vtkLODActor.h” PointCloudDemo D:\PCL1121\include\pcl-1.12\pcl\visualization\common\actor_map.h 44

这个错误是因为:包含文件的目录结构,搜寻是从上到下的,你需要在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

然后,会生成debug.txt,release.txt两个文件,这样我们现在项目是debug base
把文件库全部copy出来,贴到2.1的项目属性里面就可以了。


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;就好了】

严重性 代码 说明 项目 文件 行 禁止显示状态
错误 C4700 使用了未初始化的局部变量“w” PointCloudDemo D:\BaiduNetdiskWorkspace\DimensionXworks\3Dcamera\CloudPiontDemo\PointCloudDemo\PointCloudDemo.cpp 7786

5.4.2.2 C4996报错信息屏蔽

一些warning会被编译器默认为错误,这导致PCL的链接出问题,这个问题C4996应该对项目的使用么有大的影响:

通过禁用这个特定的警告可以避这个错误。
在这里插入图片描述

5.4.3 dll的库找不到,

dll的动态链接库,是PCL编译项目的重要一环,

5.4.3.1 编入动态库路径

通过设定系统环境路径,添加动态库的方法是最常用的方法,但是,笔者遇到有些时候,添加系统环境变量并非那么有效。
而且,对于大型项目编入动态库的地址往往很多,所以,最终你还是对一些已经预编译的动态库,要copy的制定目录。

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带了的附加问题,也就是如果某个库没有安装顺利,最终也会影响系统调试输出信息。

小结:

本文介绍了利用VS2022编译以及预编译的大型开源库PCL的例子,希望对大家有帮助。
如果有,别忘了,点赞加关注,感谢支持!!

参考:

特别感谢重要参考:

点云处理c++库——pcl安装

猜你喜欢

转载自blog.csdn.net/yellow_hill/article/details/126458692