使用PCL实现2D RANSAC线性回归时SACSegmentation<PointXY>链接报错
错误原因
该链接错误由PCL的模板预实例化机制导致:PCL为了降低整体编译耗时,会将常用点类型(如pcl::PointXYZ、pcl::PointXYZRGB等)对应的模板类提前实例化并编译进官方动态库,pcl::PointXY不属于默认预实例化的点类型范围,因此头文件的模板声明可通过编译,但链接阶段无法找到对应实例化的实现,最终抛出未定义引用错误。
最优解决方案
无需额外执行2D点转3D点的操作,仅需在引入PCL相关头文件的代码位置,追加两行手动模板实例化声明即可:
// 需提前引入依赖头文件 #include <pcl/segmentation/sac_segmentation.h> #include <pcl/sample_consensus/sac_model_line2d.h> // 手动实例化当前需要的模板类,编译器会在当前编译单元生成对应实现 template class pcl::SampleConsensusModelLine2D<pcl::PointXY>; template class pcl::SACSegmentation<pcl::PointXY>;
修改后原有pcl::SACSegmentation<pcl::PointXY>相关代码可正常编译、链接、运行,无额外数据拷贝开销,改造成本极低。
可选方案
如果后续业务逻辑需要用到3D点数据,可保留当前将2D点Z值设为0转换为pcl::PointXYZ的方案,无需额外调整。
内容的提问来源于stack exchange,提问作者Gaël Écorchard
相关产品推荐
相关产品推荐

