生产需求背景:由于部分器件的动态链接只支持32位dll,导致整体编译需要同步成win32

一般深度相机导入数据后,需要对点云数据后处理。此文选型PCL库。

从github上查到release包能支持win32的最新版本PCL1.9.1(打包的VTK8.1)。由于VTK8.1废弃了一些旧接口,导致如下错误。

pcl::visualization::PCLVisualizer *p; 

 p->removePointCloud("source");

运行removePointCloud时,VTK中调用deleteFunction删除指针。就异常退出了,具体笔者没有深入。

但VTK8.0则没有问题,可能一些旧接口仍然保留。故更改PCL1.8.1(打包的VTK8.0)

确定PCL1.8.1后,在github上release有的搭配是 

PCL-1.8.1-AllInOne-msvc2017-win32.exe

pcl-1.8.1-pdb-msvc2017-win32.zip

至此,重装系统(Win10)后,从VS2017+QT5.12.12(文章编辑时最新支持链接VS2017 32bit的QT5安装包)。

由于默认PCL allInOne中 VTK不支持QT。(若仅需VS开发,则不需重编译VTK)

故需要Cmake + VTK-v8.0.1源码,编译VTK。笔者参考了百度。

此后,编译QT时由于QT pro文件中,默认

CONFIG += c++17

故Boost库报错,有如下错误编号,供大家参考:

.hpp(): error C2143: 语法错误: 缺少“,”(在“<”的前面)

.hpp(): error C2518: 关键字“typename”在基类列表中非法;被忽略

.h(): error C2039: “auto_ptr”: 不是“std”的成员

C:\Program Files (x86)\Microsoft Visual Studio\2017\Community\VC\Tools\MSVC\14.16.27023\include\stack(218): note: 参见“std”的声明

.h(): error C4430: 缺少类型说明符 - 假定为 int。注意: C++ 不支持默认 int

.h(): error C2238: 意外的标记位于“;”之前

解决方法:

将CONFIG += c++14 即可


===============另附,VS下PCL编译报错的解决方案:=======================

C3861 “pop_t”:找不到标识符

Resolution:

 typedef unsigned long long pop_t;  //xmip

添加到错误行之前


严重性 代码 说明 项目 文件 行 禁止显示状态

错误 C2988 不可识别的模板声明/定义 PCL1 d:\pcl1.8.1\3rdparty\boost\include\boost-1_64\boost\typeof\msvc\typeof_impl.hpp 125  

错误 C2143 语法错误: 缺少“;”(在“<”的前面) PCL1 d:\pcl1.8.1\3rdparty\boost\include\boost-1_64\boost\typeof\msvc\typeof_impl.hpp 125  

错误 C2913 显式专用化;“boost::type_of::id2type_impl”不是类模板的专用化 PCL1 d:\pcl1.8.1\3rdparty\boost\include\boost-1_64\boost\typeof\msvc\typeof_impl.hpp 125  

错误 C2059 语法错误:“<” PCL1 d:\pcl1.8.1\3rdparty\boost\include\boost-1_64\boost\typeof\msvc\typeof_impl.hpp 125  

错误 C2334 “{”的前面有意外标记;跳过明显的函数体 PCL1 d:\pcl1.8.1\3rdparty\boost\include\boost-1_64\boost\typeof\msvc\typeof_impl.hpp 126  

Resolution:

源代码(如main.cpp,非报错文件typeof_impl.hpp)顶部加  #define BOOST_TYPEOF_EMULATION 或 #define BOOST_TYPEOF_COMPLIANT