VS2022点云库PCL1.12配置过程中遇到的一些奇葩问题

最近处于换工作的间歇期,原来配置的电脑交公了,各种程序数据都做了搬家。对这些程序重新配置,可以说是一地鸡毛。系统对不上,各个开源库版本一团乱麻,尤其是配置PCL库的时候,遇到了各种奇奇怪怪的问题,包括boost编译,标识符识别错误等等,简直让人无语。在本文中,我把遇到的一些奇葩问题做一个总结,以作备忘。


1. boost编译问题

我的原始项目是基于boost1.67+pcl1.8.1进行配置的。我安装原始的配置环境版本,基于VS2022重新配置本地项目,结果发现会报各种问题,如下:

LINK2019  无法解析的外部符号 "__declspec(dllimport) class boost::system::error_category const & __cdecl boost::system::generic_category(void)" (__imp_?generic_category@system@boost@ @@YAAEBVerror_category@12@XZ),函数 "public: __cdecl boost::thread_exception:: thread _exception (int,char const *)" (??0thread_exception@boost@@QEAA@HPEBD@Z) 中引用了该符号。

显然,这里是链接问题。我查到有人说这是boost编译版本不匹配所产生的问题。可是我已经确认过下载的boost版本是对应64位系统。我尝试改变库链接,还是不能解决该问题。这里我猜测是boost与系统本身不兼容所致。我尝试使用pcl1.8.1默认的boost(版本为1.64)进行配置,结果又报了新的错误:

C2059    语法错误:“<”;C2238    意外的标记位于“;”之前   

位于: typedef BOOST_DEDUCED_TYPENAME boost::detail::iterator_traits<Iterator>:: difference _type difference_type;

通过参照1.67版本对该位置进行修改,发觉还是会跳到LINK2019的错误。此时,我已经放弃了对该配置的尝试,决定使用更新的版本。


2. PCL新版本配置问题

我使用的是PCL1.12.1版本,使用PCL库自带的boost以避免版本兼容问题。配置方法可以按照网上的教程进行就可以。链接:VS2019+pcl1.12.1配置详解_wuchuhang的博客-CSDN博客

配置完成后,示例程序执行正常,但是配置我的本地项目后,报错:

检查后,发现主要的错误集中在convolution_3d.h文件,具体位置为:

using KdTree = pcl::search::Search<PointIn>;

boost::optional<float> sigma_coefficient_;

完全不明白是怎么回事,于是我把convolution_3d.h的引用删掉了,编译通过。开始我以为是库中途,为了验证,我在网上找了一个源代码,然后把不相关的库全部删掉,测试:

#include <iostream>
#include <pcl/io/pcd_io.h>
#include <pcl/point_types.h>
#include <pcl/filters/convolution_3d.h>
#include <pcl/filters/convolution.h>
#include <pcl/search/kdtree.h>
 
int main(int argc, char** argv)
{
	pcl::PointCloud<pcl::PointXYZ>::Ptr inputCloud(new pcl::PointCloud<pcl::PointXYZ>);
	pcl::PointCloud<pcl::PointXYZ>::Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
 
	if (pcl::io::loadPCDFile("test.pcd", *inputCloud) == -1)
	{
		PCL_ERROR("Couldn't read file test_pcd.pcd\n");
		return(-1);
	}
	pcl::filters::Convolution<pcl::PointXYZ, pcl::PointXYZ>  convolution;
	Eigen::ArrayXf gaussian_kernel(5);
	gaussian_kernel << 1.f / 16, 1.f / 4, 3.f / 8, 1.f / 4, 1.f / 16;
	convolution.setBordersPolicy(
	pcl::filters::Convolution<pcl::PointXYZ, pcl::PointXYZ>::BORDERS_POLICY_IGNORE);
	convolution.setDistanceThreshold(static_cast<float> (0.1));
	convolution.setInputCloud(inputCloud);
	convolution.setKernel(gaussian_kernel);
	convolution.convolve(*cloud);
}

还是报同样的错,删掉对convolution_3d.h的引用,问题解决。

猜你喜欢

转载自blog.csdn.net/aliexken/article/details/128582321