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的引用,问题解决。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序猿老甘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值