飞道的博客

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

452人阅读  评论(0)

最近处于换工作的间歇期,原来配置的电脑交公了,各种程序数据都做了搬家。对这些程序重新配置,可以说是一地鸡毛。系统对不上,各个开源库版本一团乱麻,尤其是配置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的引用删掉了,编译通过。开始我以为是库中途,为了验证,我在网上找了一个源代码,然后把不相关的库全部删掉,测试:


  
  1. #include <iostream>
  2. #include <pcl/io/pcd_io.h>
  3. #include <pcl/point_types.h>
  4. #include <pcl/filters/convolution_3d.h>
  5. #include <pcl/filters/convolution.h>
  6. #include <pcl/search/kdtree.h>
  7. int main(int argc, char** argv)
  8. {
  9. pcl::PointCloud<pcl::PointXYZ>:: Ptr inputCloud(new pcl::PointCloud<pcl::PointXYZ>);
  10. pcl::PointCloud<pcl::PointXYZ>:: Ptr cloud(new pcl::PointCloud<pcl::PointXYZ>);
  11. if (pcl::io:: loadPCDFile( "test.pcd", *inputCloud) == -1)
  12. {
  13. PCL_ERROR( "Couldn't read file test_pcd.pcd\n");
  14. return( -1);
  15. }
  16. pcl::filters::Convolution<pcl::PointXYZ, pcl::PointXYZ> convolution;
  17. Eigen::ArrayXf gaussian_kernel(5);
  18. gaussian_kernel << 1.f / 16, 1.f / 4, 3.f / 8, 1.f / 4, 1.f / 16;
  19. convolution. setBordersPolicy(
  20. pcl::filters::Convolution<pcl::PointXYZ, pcl::PointXYZ>::BORDERS_POLICY_IGNORE);
  21. convolution. setDistanceThreshold( static_cast< float> ( 0.1));
  22. convolution. setInputCloud(inputCloud);
  23. convolution. setKernel(gaussian_kernel);
  24. convolution. convolve(*cloud);
  25. }

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


转载:https://blog.csdn.net/aliexken/article/details/128582321
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场