ICP帧间匹配demo编译出错:
项目地址:https://blog.youkuaiyun.com/tiancailx/article/details/111031536
问题描述
编译时出现编译错误,如下图所示
原因分析:
可以看到明显的报错信息是“对‘pcl::search::Searchpcl::PointXYZ::getNameabi:cxx11 const’未定义的引用”,推测缺少包含该函数的头文件引用。
解决方案:
直接说解决方法:在scan_match_icp.h 头文件里包含search.hpp头文件
#include <pcl/search/impl/search.hpp>
具体解决思路:
- 确认下包含该函数的头文件在我们路径中的什么位置,先搜索下pcl库安装位置
dpkg -L libpcl-dev
会跳出来非常多的头文件的位置啊,可以确定pcl路径就在 /usr/include/pcl-1.7/pcl/这部分了(我用的1.7版本,版本号可能和各位不同)
- 进一步缩小搜索位置
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 文件(实现文件):
- 头文件(search.h):
头文件(如 search.h)通常只包含类的声明和成员函数的声明,而不包含模板类的具体实现。
由于模板类的实现需要在编译时可见,如果只有声明而没有实现,调用模板成员函数时就会出现链接错误。
- 实现文件(impl/search.hpp):
PCL 将模板类的实现放在 impl 目录下的 .hpp 文件中(如 impl/search.hpp)。
在 search.hpp 中定义了 pcl::search::Search 模板类的所有成员函数(包括 getName()),因此需要包含该文件来使编译器能够看到这些实现。
- 模板类的特殊性:
模板类的实现需要放在头文件中,或者通过包含实现文件(如 impl/search.hpp)来确保编译器在实例化模板时能够看到模板成员函数的具体定义。
如果只包含 search.h,那么编译器只能看到 Search 类的声明,而无法看到 getName() 函数的具体定义,因此会引发链接错误。
解决方案总结
使用 #include <pcl/search/impl/search.hpp> 可以解决模板类链接错误,因为这个头文件包含了 pcl::search::Search 模板类的所有成员函数的实现。