最近处于换工作的间歇期,原来配置的电脑交公了,各种程序数据都做了搬家。对这些程序重新配置,可以说是一地鸡毛。系统对不上,各个开源库版本一团乱麻,尤其是配置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博客
配置完成后,示例程序执行正常,但是配置我的本地项目后,报错:
![](/qrcode.jpg)
检查后,发现主要的错误集中在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的引用,问题解决。