对‘pcl::search::Search<pcl::PointXYZ>::getName[abi:cxx11]() const’未定义的引用

ICP帧间匹配demo编译出错:

项目地址:https://blog.csdn.net/tiancailx/article/details/111031536


问题描述

编译时出现编译错误,如下图所示
在这里插入图片描述


原因分析:

可以看到明显的报错信息是“对‘pcl::search::Searchpcl::PointXYZ::getNameabi:cxx11 const’未定义的引用”,推测缺少包含该函数的头文件引用。


解决方案:

直接说解决方法:在scan_match_icp.h 头文件里包含search.hpp头文件
#include <pcl/search/impl/search.hpp>

具体解决思路:

  1. 确认下包含该函数的头文件在我们路径中的什么位置,先搜索下pcl库安装位置
dpkg -L libpcl-dev

在这里插入图片描述
会跳出来非常多的头文件的位置啊,可以确定pcl路径就在 /usr/include/pcl-1.7/pcl/这部分了(我用的1.7版本,版本号可能和各位不同)

  1. 进一步缩小搜索位置
cd /usr/include/pcl-1.7/pcl/
ll

在这里插入图片描述
确实找到search文件夹
其中search文件夹下有一个search.h,其中我们找到了getName的声明
在这里插入图片描述
search下面还有一个文件夹impl,其中有个search.hpp文件,打开这个文件我们找到了getName函数的定义:
在这里插入图片描述
这里解释下search.h和search.cpp的关系

PCL 的模板类实现通常分为 .h 或 .hpp 文件(头文件)和 impl 目录下的 .hpp 文件(实现文件):

  1. 头文件(search.h):

头文件(如 search.h)通常只包含类的声明和成员函数的声明,而不包含模板类的具体实现。
由于模板类的实现需要在编译时可见,如果只有声明而没有实现,调用模板成员函数时就会出现链接错误。

  1. 实现文件(impl/search.hpp):

PCL 将模板类的实现放在 impl 目录下的 .hpp 文件中(如 impl/search.hpp)。
在 search.hpp 中定义了 pcl::search::Search 模板类的所有成员函数(包括 getName()),因此需要包含该文件来使编译器能够看到这些实现。

  1. 模板类的特殊性:

模板类的实现需要放在头文件中,或者通过包含实现文件(如 impl/search.hpp)来确保编译器在实例化模板时能够看到模板成员函数的具体定义。
如果只包含 search.h,那么编译器只能看到 Search 类的声明,而无法看到 getName() 函数的具体定义,因此会引发链接错误。

解决方案总结

使用 #include <pcl/search/impl/search.hpp> 可以解决模板类链接错误,因为这个头文件包含了 pcl::search::Search 模板类的所有成员函数的实现。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值