--- 提前总结

即:在你项目的main函数中,在包含pcl库头文件之前,加上该宏——

#define PCL_NO_PRECOMPILE

---

--- 2025.3.13更新

最近编译代码的时候pcl库又报错了,折腾半天,还是自己写的博客给出了解决方法:

Linking CXX executable /home/sy/lidar/devel/lib/rolo/rolo_lidarOdometry
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(rot_vgicp.cpp.o): in function `pcl::Registration<pcl::PointXYZ, pcl::PointXYZ, float>::setInputSource(boost::shared_ptr<pcl::PointCloud<pcl::PointXYZ> const> const&)':
/usr/include/pcl-1.10/pcl/registration/registration.h:193: undefined reference to `pcl::PCLBase<pcl::PointXYZ>::setInputCloud(boost::shared_ptr<pcl::PointCloud<pcl::PointXYZ> const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(rot_vgicp.cpp.o): in function `pcl::Registration<pcl::PointXYZI, pcl::PointXYZI, float>::setInputSource(boost::shared_ptr<pcl::PointCloud<pcl::PointXYZI> const> const&)':
/usr/include/pcl-1.10/pcl/registration/registration.h:193: undefined reference to `pcl::PCLBase<pcl::PointXYZI>::setInputCloud(boost::shared_ptr<pcl::PointCloud<pcl::PointXYZI> const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(rot_vgicp.cpp.o): in function `pcl::Registration<pcl::PointNormal, pcl::PointNormal, float>::setInputSource(boost::shared_ptr<pcl::PointCloud<pcl::PointNormal> const> const&)':
/usr/include/pcl-1.10/pcl/registration/registration.h:193: undefined reference to `pcl::PCLBase<pcl::PointNormal>::setInputCloud(boost::shared_ptr<pcl::PointCloud<pcl::PointNormal> const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(rot_vgicp.cpp.o):(.data.rel.ro._ZTVN3pcl6search6SearchINS_8PointXYZEEE[_ZTVN3pcl6search6SearchINS_8PointXYZEEE]+0x38): undefined reference to `pcl::search::Search<pcl::PointXYZ>::setInputCloud(boost::shared_ptr<pcl::PointCloud<pcl::PointXYZ> const> const&, boost::shared_ptr<std::vector<int, std::allocator<int> > const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(rot_vgicp.cpp.o):(.data.rel.ro._ZTVN3pcl6search6KdTreeINS_8PointXYZENS_11KdTreeFLANNIS2_N5flann9L2_SimpleIfEEEEEE[_ZTVN3pcl6search6KdTreeINS_8PointXYZENS_11KdTreeFLANNIS2_N5flann9L2_SimpleIfEEEEEE]+0x38): undefined reference to `pcl::search::KdTree<pcl::PointXYZ, pcl::KdTreeFLANN<pcl::PointXYZ, flann::L2_Simple<float> > >::setInputCloud(boost::shared_ptr<pcl::PointCloud<pcl::PointXYZ> const> const&, boost::shared_ptr<std::vector<int, std::allocator<int> > const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(rot_vgicp.cpp.o):(.data.rel.ro._ZTVN9fast_gicp8RotVGICPIN3pcl8PointXYZES2_EE[_ZTVN9fast_gicp8RotVGICPIN3pcl8PointXYZES2_EE]+0x20): undefined reference to `pcl::PCLBase<pcl::PointXYZ>::setInputCloud(boost::shared_ptr<pcl::PointCloud<pcl::PointXYZ> const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(rot_vgicp.cpp.o):(.data.rel.ro._ZTVN9fast_gicp8RotVGICPIN3pcl8PointXYZES2_EE[_ZTVN9fast_gicp8RotVGICPIN3pcl8PointXYZES2_EE]+0x28): undefined reference to `pcl::PCLBase<pcl::PointXYZ>::setIndices(boost::shared_ptr<std::vector<int, std::allocator<int> > > const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(rot_vgicp.cpp.o):(.data.rel.ro._ZTVN9fast_gicp8RotVGICPIN3pcl8PointXYZES2_EE[_ZTVN9fast_gicp8RotVGICPIN3pcl8PointXYZES2_EE]+0x30): undefined reference to `pcl::PCLBase<pcl::PointXYZ>::setIndices(boost::shared_ptr<std::vector<int, std::allocator<int> > const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(rot_vgicp.cpp.o):(.data.rel.ro._ZTVN9fast_gicp8RotVGICPIN3pcl8PointXYZES2_EE[_ZTVN9fast_gicp8RotVGICPIN3pcl8PointXYZES2_EE]+0x38): undefined reference to `pcl::PCLBase<pcl::PointXYZ>::setIndices(boost::shared_ptr<pcl::PointIndices const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(rot_vgicp.cpp.o):(.data.rel.ro._ZTVN3pcl6search6SearchINS_9PointXYZIEEE[_ZTVN3pcl6search6SearchINS_9PointXYZIEEE]+0x38): undefined reference to `pcl::search::Search<pcl::PointXYZI>::setInputCloud(boost::shared_ptr<pcl::PointCloud<pcl::PointXYZI> const> const&, boost::shared_ptr<std::vector<int, std::allocator<int> > const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(rot_vgicp.cpp.o):(.data.rel.ro._ZTVN3pcl6search6KdTreeINS_9PointXYZIENS_11KdTreeFLANNIS2_N5flann9L2_SimpleIfEEEEEE[_ZTVN3pcl6search6KdTreeINS_9PointXYZIENS_11KdTreeFLANNIS2_N5flann9L2_SimpleIfEEEEEE]+0x38): undefined reference to `pcl::search::KdTree<pcl::PointXYZI, pcl::KdTreeFLANN<pcl::PointXYZI, flann::L2_Simple<float> > >::setInputCloud(boost::shared_ptr<pcl::PointCloud<pcl::PointXYZI> const> const&, boost::shared_ptr<std::vector<int, std::allocator<int> > const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(rot_vgicp.cpp.o):(.data.rel.ro._ZTVN9fast_gicp8RotVGICPIN3pcl9PointXYZIES2_EE[_ZTVN9fast_gicp8RotVGICPIN3pcl9PointXYZIES2_EE]+0x20): undefined reference to `pcl::PCLBase<pcl::PointXYZI>::setInputCloud(boost::shared_ptr<pcl::PointCloud<pcl::PointXYZI> const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(rot_vgicp.cpp.o):(.data.rel.ro._ZTVN9fast_gicp8RotVGICPIN3pcl9PointXYZIES2_EE[_ZTVN9fast_gicp8RotVGICPIN3pcl9PointXYZIES2_EE]+0x28): undefined reference to `pcl::PCLBase<pcl::PointXYZI>::setIndices(boost::shared_ptr<std::vector<int, std::allocator<int> > > const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(rot_vgicp.cpp.o):(.data.rel.ro._ZTVN9fast_gicp8RotVGICPIN3pcl9PointXYZIES2_EE[_ZTVN9fast_gicp8RotVGICPIN3pcl9PointXYZIES2_EE]+0x30): undefined reference to `pcl::PCLBase<pcl::PointXYZI>::setIndices(boost::shared_ptr<std::vector<int, std::allocator<int> > const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(rot_vgicp.cpp.o):(.data.rel.ro._ZTVN9fast_gicp8RotVGICPIN3pcl9PointXYZIES2_EE[_ZTVN9fast_gicp8RotVGICPIN3pcl9PointXYZIES2_EE]+0x38): undefined reference to `pcl::PCLBase<pcl::PointXYZI>::setIndices(boost::shared_ptr<pcl::PointIndices const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(rot_vgicp.cpp.o):(.data.rel.ro._ZTVN3pcl6search6SearchINS_11PointNormalEEE[_ZTVN3pcl6search6SearchINS_11PointNormalEEE]+0x38): undefined reference to `pcl::search::Search<pcl::PointNormal>::setInputCloud(boost::shared_ptr<pcl::PointCloud<pcl::PointNormal> const> const&, boost::shared_ptr<std::vector<int, std::allocator<int> > const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(rot_vgicp.cpp.o):(.data.rel.ro._ZTVN3pcl6search6KdTreeINS_11PointNormalENS_11KdTreeFLANNIS2_N5flann9L2_SimpleIfEEEEEE[_ZTVN3pcl6search6KdTreeINS_11PointNormalENS_11KdTreeFLANNIS2_N5flann9L2_SimpleIfEEEEEE]+0x38): undefined reference to `pcl::search::KdTree<pcl::PointNormal, pcl::KdTreeFLANN<pcl::PointNormal, flann::L2_Simple<float> > >::setInputCloud(boost::shared_ptr<pcl::PointCloud<pcl::PointNormal> const> const&, boost::shared_ptr<std::vector<int, std::allocator<int> > const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(rot_vgicp.cpp.o):(.data.rel.ro._ZTVN9fast_gicp8RotVGICPIN3pcl11PointNormalES2_EE[_ZTVN9fast_gicp8RotVGICPIN3pcl11PointNormalES2_EE]+0x20): undefined reference to `pcl::PCLBase<pcl::PointNormal>::setInputCloud(boost::shared_ptr<pcl::PointCloud<pcl::PointNormal> const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(rot_vgicp.cpp.o):(.data.rel.ro._ZTVN9fast_gicp8RotVGICPIN3pcl11PointNormalES2_EE[_ZTVN9fast_gicp8RotVGICPIN3pcl11PointNormalES2_EE]+0x28): undefined reference to `pcl::PCLBase<pcl::PointNormal>::setIndices(boost::shared_ptr<std::vector<int, std::allocator<int> > > const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(rot_vgicp.cpp.o):(.data.rel.ro._ZTVN9fast_gicp8RotVGICPIN3pcl11PointNormalES2_EE[_ZTVN9fast_gicp8RotVGICPIN3pcl11PointNormalES2_EE]+0x30): undefined reference to `pcl::PCLBase<pcl::PointNormal>::setIndices(boost::shared_ptr<std::vector<int, std::allocator<int> > const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(rot_vgicp.cpp.o):(.data.rel.ro._ZTVN9fast_gicp8RotVGICPIN3pcl11PointNormalES2_EE[_ZTVN9fast_gicp8RotVGICPIN3pcl11PointNormalES2_EE]+0x38): undefined reference to `pcl::PCLBase<pcl::PointNormal>::setIndices(boost::shared_ptr<pcl::PointIndices const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o): in function `pcl::Registration<pcl::PointXYZ, pcl::PointXYZ, float>::setInputSource(boost::shared_ptr<pcl::PointCloud<pcl::PointXYZ> const> const&)':
/usr/include/pcl-1.10/pcl/registration/registration.h:193: undefined reference to `pcl::PCLBase<pcl::PointXYZ>::setInputCloud(boost::shared_ptr<pcl::PointCloud<pcl::PointXYZ> const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o): in function `pcl::Registration<pcl::PointXYZI, pcl::PointXYZI, float>::setInputSource(boost::shared_ptr<pcl::PointCloud<pcl::PointXYZI> const> const&)':
/usr/include/pcl-1.10/pcl/registration/registration.h:193: undefined reference to `pcl::PCLBase<pcl::PointXYZI>::setInputCloud(boost::shared_ptr<pcl::PointCloud<pcl::PointXYZI> const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o): in function `pcl::Registration<pcl::PointNormal, pcl::PointNormal, float>::setInputSource(boost::shared_ptr<pcl::PointCloud<pcl::PointNormal> const> const&)':
/usr/include/pcl-1.10/pcl/registration/registration.h:193: undefined reference to `pcl::PCLBase<pcl::PointNormal>::setInputCloud(boost::shared_ptr<pcl::PointCloud<pcl::PointNormal> const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN3pcl7PCLBaseINS_8PointXYZEEE[_ZTVN3pcl7PCLBaseINS_8PointXYZEEE]+0x20): undefined reference to `pcl::PCLBase<pcl::PointXYZ>::setInputCloud(boost::shared_ptr<pcl::PointCloud<pcl::PointXYZ> const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN3pcl7PCLBaseINS_8PointXYZEEE[_ZTVN3pcl7PCLBaseINS_8PointXYZEEE]+0x28): undefined reference to `pcl::PCLBase<pcl::PointXYZ>::setIndices(boost::shared_ptr<std::vector<int, std::allocator<int> > > const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN3pcl7PCLBaseINS_8PointXYZEEE[_ZTVN3pcl7PCLBaseINS_8PointXYZEEE]+0x30): undefined reference to `pcl::PCLBase<pcl::PointXYZ>::setIndices(boost::shared_ptr<std::vector<int, std::allocator<int> > const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN3pcl7PCLBaseINS_8PointXYZEEE[_ZTVN3pcl7PCLBaseINS_8PointXYZEEE]+0x38): undefined reference to `pcl::PCLBase<pcl::PointXYZ>::setIndices(boost::shared_ptr<pcl::PointIndices const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN3pcl12RegistrationINS_8PointXYZES1_fEE[_ZTVN3pcl12RegistrationINS_8PointXYZES1_fEE]+0x20): undefined reference to `pcl::PCLBase<pcl::PointXYZ>::setInputCloud(boost::shared_ptr<pcl::PointCloud<pcl::PointXYZ> const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN3pcl12RegistrationINS_8PointXYZES1_fEE[_ZTVN3pcl12RegistrationINS_8PointXYZES1_fEE]+0x28): undefined reference to `pcl::PCLBase<pcl::PointXYZ>::setIndices(boost::shared_ptr<std::vector<int, std::allocator<int> > > const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN3pcl12RegistrationINS_8PointXYZES1_fEE[_ZTVN3pcl12RegistrationINS_8PointXYZES1_fEE]+0x30): undefined reference to `pcl::PCLBase<pcl::PointXYZ>::setIndices(boost::shared_ptr<std::vector<int, std::allocator<int> > const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN3pcl12RegistrationINS_8PointXYZES1_fEE[_ZTVN3pcl12RegistrationINS_8PointXYZES1_fEE]+0x38): undefined reference to `pcl::PCLBase<pcl::PointXYZ>::setIndices(boost::shared_ptr<pcl::PointIndices const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN9fast_gicp15LsqRegistrationIN3pcl8PointXYZES2_EE[_ZTVN9fast_gicp15LsqRegistrationIN3pcl8PointXYZES2_EE]+0x20): undefined reference to `pcl::PCLBase<pcl::PointXYZ>::setInputCloud(boost::shared_ptr<pcl::PointCloud<pcl::PointXYZ> const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN9fast_gicp15LsqRegistrationIN3pcl8PointXYZES2_EE[_ZTVN9fast_gicp15LsqRegistrationIN3pcl8PointXYZES2_EE]+0x28): undefined reference to `pcl::PCLBase<pcl::PointXYZ>::setIndices(boost::shared_ptr<std::vector<int, std::allocator<int> > > const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN9fast_gicp15LsqRegistrationIN3pcl8PointXYZES2_EE[_ZTVN9fast_gicp15LsqRegistrationIN3pcl8PointXYZES2_EE]+0x30): undefined reference to `pcl::PCLBase<pcl::PointXYZ>::setIndices(boost::shared_ptr<std::vector<int, std::allocator<int> > const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN9fast_gicp15LsqRegistrationIN3pcl8PointXYZES2_EE[_ZTVN9fast_gicp15LsqRegistrationIN3pcl8PointXYZES2_EE]+0x38): undefined reference to `pcl::PCLBase<pcl::PointXYZ>::setIndices(boost::shared_ptr<pcl::PointIndices const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN3pcl7PCLBaseINS_9PointXYZIEEE[_ZTVN3pcl7PCLBaseINS_9PointXYZIEEE]+0x20): undefined reference to `pcl::PCLBase<pcl::PointXYZI>::setInputCloud(boost::shared_ptr<pcl::PointCloud<pcl::PointXYZI> const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN3pcl7PCLBaseINS_9PointXYZIEEE[_ZTVN3pcl7PCLBaseINS_9PointXYZIEEE]+0x28): undefined reference to `pcl::PCLBase<pcl::PointXYZI>::setIndices(boost::shared_ptr<std::vector<int, std::allocator<int> > > const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN3pcl7PCLBaseINS_9PointXYZIEEE[_ZTVN3pcl7PCLBaseINS_9PointXYZIEEE]+0x30): undefined reference to `pcl::PCLBase<pcl::PointXYZI>::setIndices(boost::shared_ptr<std::vector<int, std::allocator<int> > const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN3pcl7PCLBaseINS_9PointXYZIEEE[_ZTVN3pcl7PCLBaseINS_9PointXYZIEEE]+0x38): undefined reference to `pcl::PCLBase<pcl::PointXYZI>::setIndices(boost::shared_ptr<pcl::PointIndices const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN3pcl12RegistrationINS_9PointXYZIES1_fEE[_ZTVN3pcl12RegistrationINS_9PointXYZIES1_fEE]+0x20): undefined reference to `pcl::PCLBase<pcl::PointXYZI>::setInputCloud(boost::shared_ptr<pcl::PointCloud<pcl::PointXYZI> const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN3pcl12RegistrationINS_9PointXYZIES1_fEE[_ZTVN3pcl12RegistrationINS_9PointXYZIES1_fEE]+0x28): undefined reference to `pcl::PCLBase<pcl::PointXYZI>::setIndices(boost::shared_ptr<std::vector<int, std::allocator<int> > > const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN3pcl12RegistrationINS_9PointXYZIES1_fEE[_ZTVN3pcl12RegistrationINS_9PointXYZIES1_fEE]+0x30): undefined reference to `pcl::PCLBase<pcl::PointXYZI>::setIndices(boost::shared_ptr<std::vector<int, std::allocator<int> > const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN3pcl12RegistrationINS_9PointXYZIES1_fEE[_ZTVN3pcl12RegistrationINS_9PointXYZIES1_fEE]+0x38): undefined reference to `pcl::PCLBase<pcl::PointXYZI>::setIndices(boost::shared_ptr<pcl::PointIndices const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN9fast_gicp15LsqRegistrationIN3pcl9PointXYZIES2_EE[_ZTVN9fast_gicp15LsqRegistrationIN3pcl9PointXYZIES2_EE]+0x20): undefined reference to `pcl::PCLBase<pcl::PointXYZI>::setInputCloud(boost::shared_ptr<pcl::PointCloud<pcl::PointXYZI> const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN9fast_gicp15LsqRegistrationIN3pcl9PointXYZIES2_EE[_ZTVN9fast_gicp15LsqRegistrationIN3pcl9PointXYZIES2_EE]+0x28): undefined reference to `pcl::PCLBase<pcl::PointXYZI>::setIndices(boost::shared_ptr<std::vector<int, std::allocator<int> > > const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN9fast_gicp15LsqRegistrationIN3pcl9PointXYZIES2_EE[_ZTVN9fast_gicp15LsqRegistrationIN3pcl9PointXYZIES2_EE]+0x30): undefined reference to `pcl::PCLBase<pcl::PointXYZI>::setIndices(boost::shared_ptr<std::vector<int, std::allocator<int> > const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN9fast_gicp15LsqRegistrationIN3pcl9PointXYZIES2_EE[_ZTVN9fast_gicp15LsqRegistrationIN3pcl9PointXYZIES2_EE]+0x38): undefined reference to `pcl::PCLBase<pcl::PointXYZI>::setIndices(boost::shared_ptr<pcl::PointIndices const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN3pcl7PCLBaseINS_11PointNormalEEE[_ZTVN3pcl7PCLBaseINS_11PointNormalEEE]+0x20): undefined reference to `pcl::PCLBase<pcl::PointNormal>::setInputCloud(boost::shared_ptr<pcl::PointCloud<pcl::PointNormal> const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN3pcl7PCLBaseINS_11PointNormalEEE[_ZTVN3pcl7PCLBaseINS_11PointNormalEEE]+0x28): undefined reference to `pcl::PCLBase<pcl::PointNormal>::setIndices(boost::shared_ptr<std::vector<int, std::allocator<int> > > const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN3pcl7PCLBaseINS_11PointNormalEEE[_ZTVN3pcl7PCLBaseINS_11PointNormalEEE]+0x30): undefined reference to `pcl::PCLBase<pcl::PointNormal>::setIndices(boost::shared_ptr<std::vector<int, std::allocator<int> > const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN3pcl7PCLBaseINS_11PointNormalEEE[_ZTVN3pcl7PCLBaseINS_11PointNormalEEE]+0x38): undefined reference to `pcl::PCLBase<pcl::PointNormal>::setIndices(boost::shared_ptr<pcl::PointIndices const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN3pcl12RegistrationINS_11PointNormalES1_fEE[_ZTVN3pcl12RegistrationINS_11PointNormalES1_fEE]+0x20): undefined reference to `pcl::PCLBase<pcl::PointNormal>::setInputCloud(boost::shared_ptr<pcl::PointCloud<pcl::PointNormal> const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN3pcl12RegistrationINS_11PointNormalES1_fEE[_ZTVN3pcl12RegistrationINS_11PointNormalES1_fEE]+0x28): undefined reference to `pcl::PCLBase<pcl::PointNormal>::setIndices(boost::shared_ptr<std::vector<int, std::allocator<int> > > const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN3pcl12RegistrationINS_11PointNormalES1_fEE[_ZTVN3pcl12RegistrationINS_11PointNormalES1_fEE]+0x30): undefined reference to `pcl::PCLBase<pcl::PointNormal>::setIndices(boost::shared_ptr<std::vector<int, std::allocator<int> > const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN3pcl12RegistrationINS_11PointNormalES1_fEE[_ZTVN3pcl12RegistrationINS_11PointNormalES1_fEE]+0x38): undefined reference to `pcl::PCLBase<pcl::PointNormal>::setIndices(boost::shared_ptr<pcl::PointIndices const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN9fast_gicp15LsqRegistrationIN3pcl11PointNormalES2_EE[_ZTVN9fast_gicp15LsqRegistrationIN3pcl11PointNormalES2_EE]+0x20): undefined reference to `pcl::PCLBase<pcl::PointNormal>::setInputCloud(boost::shared_ptr<pcl::PointCloud<pcl::PointNormal> const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN9fast_gicp15LsqRegistrationIN3pcl11PointNormalES2_EE[_ZTVN9fast_gicp15LsqRegistrationIN3pcl11PointNormalES2_EE]+0x28): undefined reference to `pcl::PCLBase<pcl::PointNormal>::setIndices(boost::shared_ptr<std::vector<int, std::allocator<int> > > const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN9fast_gicp15LsqRegistrationIN3pcl11PointNormalES2_EE[_ZTVN9fast_gicp15LsqRegistrationIN3pcl11PointNormalES2_EE]+0x30): undefined reference to `pcl::PCLBase<pcl::PointNormal>::setIndices(boost::shared_ptr<std::vector<int, std::allocator<int> > const> const&)'
/usr/bin/ld: /home/sy/lidar/devel/lib/librot_gicp.a(lsq_registration.cpp.o):(.data.rel.ro._ZTVN9fast_gicp15LsqRegistrationIN3pcl11PointNormalES2_EE[_ZTVN9fast_gicp15LsqRegistrationIN3pcl11PointNormalES2_EE]+0x38): undefined reference to `pcl::PCLBase<pcl::PointNormal>::setIndices(boost::shared_ptr<pcl::PointIndices const> const&)'

在cmakelist中加入宏定义

add_definitions(-DPCL_NO_PRECOMPILE)

即可解决:

---原回答

今日编译代码时,PCL库一直出现错误。

从CMakeList检查到PCL库,从新项目代码对比到旧项目代码均没发现问题,很困惑,怎么就PCL::KDTree突然就不给用了。。。。。

/usr/bin/ld: CMakeFiles/CGS_lidar_seg.dir/CGS_lidar_seg.cpp.o: in function `count_num_ground_TP(pcl::PointCloud<PointXYZILID> const&, pcl::PointCloud<PointXYZILID>&)':
/home/sy/lidar/src/GLU-seg/src/utils.h:147: undefined reference to `pcl::KdTreeFLANN<PointXYZILID, flann::L2_Simple<float> >::KdTreeFLANN(bool)'
/usr/bin/ld: /home/sy/lidar/src/GLU-seg/src/utils.h:148: undefined reference to `pcl::KdTreeFLANN<PointXYZILID, flann::L2_Simple<float> >::setInputCloud(boost::shared_ptr<pcl::PointCloud<PointXYZILID> const> const&, boost::shared_ptr<std::vector<int, std::allocator<int> > const> const&)'
/usr/bin/ld: /home/sy/lidar/src/GLU-seg/src/utils.h:159: undefined reference to `pcl::KdTreeFLANN<PointXYZILID, flann::L2_Simple<float> >::nearestKSearch(PointXYZILID const&, int, std::vector<int, std::allocator<int> >&, std::vector<float, std::allocator<float> >&) const'
/usr/bin/ld: CMakeFiles/CGS_lidar_seg.dir/CGS_lidar_seg.cpp.o: in function `pcl::KdTreeFLANN<PointXYZILID, flann::L2_Simple<float> >::~KdTreeFLANN()':
/usr/include/pcl-1.10/pcl/kdtree/kdtree_flann.h:136: undefined reference to `pcl::KdTreeFLANN<PointXYZILID, flann::L2_Simple<float> >::cleanup()'
/usr/bin/ld: /usr/include/pcl-1.10/pcl/kdtree/kdtree_flann.h:136: undefined reference to `pcl::KdTreeFLANN<PointXYZILID, flann::L2_Simple<float> >::cleanup()'
/usr/bin/ld: CMakeFiles/CGS_lidar_seg.dir/CGS_lidar_seg.cpp.o: in function `pcl::KdTreeFLANN<PointXYZILID, flann::L2_Simple<float> >::~KdTreeFLANN()':
/usr/include/pcl-1.10/pcl/kdtree/kdtree_flann.h:136: undefined reference to `pcl::KdTreeFLANN<PointXYZILID, flann::L2_Simple<float> >::cleanup()'
/usr/bin/ld: CMakeFiles/CGS_lidar_seg.dir/CGS_lidar_seg.cpp.o:(.data.rel.ro._ZTVN3pcl11KdTreeFLANNI12PointXYZILIDN5flann9L2_SimpleIfEEEE[_ZTVN3pcl11KdTreeFLANNI12PointXYZILIDN5flann9L2_SimpleIfEEEE]+0x10): undefined reference to `pcl::KdTreeFLANN<PointXYZILID, flann::L2_Simple<float> >::setInputCloud(boost::shared_ptr<pcl::PointCloud<PointXYZILID> const> const&, boost::shared_ptr<std::vector<int, std::allocator<int> > const> const&)'
/usr/bin/ld: CMakeFiles/CGS_lidar_seg.dir/CGS_lidar_seg.cpp.o:(.data.rel.ro._ZTVN3pcl11KdTreeFLANNI12PointXYZILIDN5flann9L2_SimpleIfEEEE[_ZTVN3pcl11KdTreeFLANNI12PointXYZILIDN5flann9L2_SimpleIfEEEE]+0x28): undefined reference to `pcl::KdTreeFLANN<PointXYZILID, flann::L2_Simple<float> >::nearestKSearch(PointXYZILID const&, int, std::vector<int, std::allocator<int> >&, std::vector<float, std::allocator<float> >&) const'
/usr/bin/ld: CMakeFiles/CGS_lidar_seg.dir/CGS_lidar_seg.cpp.o:(.data.rel.ro._ZTVN3pcl11KdTreeFLANNI12PointXYZILIDN5flann9L2_SimpleIfEEEE[_ZTVN3pcl11KdTreeFLANNI12PointXYZILIDN5flann9L2_SimpleIfEEEE]+0x40): undefined reference to `pcl::KdTreeFLANN<PointXYZILID, flann::L2_Simple<float> >::radiusSearch(PointXYZILID const&, double, std::vector<int, std::allocator<int> >&, std::vector<float, std::allocator<float> >&, unsigned int) const'
/usr/bin/ld: CMakeFiles/CGS_lidar_seg.dir/CGS_lidar_seg.cpp.o:(.data.rel.ro._ZTVN3pcl11KdTreeFLANNI12PointXYZILIDN5flann9L2_SimpleIfEEEE[_ZTVN3pcl11KdTreeFLANNI12PointXYZILIDN5flann9L2_SimpleIfEEEE]+0x58): undefined reference to `pcl::KdTreeFLANN<PointXYZILID, flann::L2_Simple<float> >::setEpsilon(float)'

查阅了相关参考资料,基本上都是说可以通过修改源码的方式,在pcl/include/kdtree_flann.h里添加宏:

#pragma once

#include <pcl/kdtree/kdtree.h>
#include <flann/util/params.h>

#include <memory>

#define PCL_NO_PRECOMPILE

// Forward declarations
namespace flann
{
  template <typename T> struct L2_Simple;
  template <typename T> class Index;
}

namespace pcl
{
  // Forward declarations
  template <typename T> class PointRepresentation;

...

但对本工程并没起到作用(事后反思有可能是项目里pcl库路径设置不对,导致Cmakelist没找对)。

反正重点是在 PCL_NO_PRECOMPILE 这个宏。

又经过一番搜索,问题原来是pcl对于自定义点云数据类型的使用我是直接copy的以前项目的代码,但是我没有用对。以下是pcl官方文档关于此宏和自定义点云类型的要求。

https://pcl.readthedocs.io/projects/tutorials/en/master/adding_custom_ptype.html pcl文档

Starting with PCL-1.7 you need to define PCL_NO_PRECOMPILE before you include any PCL headers to include the templated algorithms as well.

从1.7版本以后,如果要使用自定义点云数据类型,就必须需要在项目中添加PCL_NO_PRECOMPILE 宏。给出官方关于PCL自定义点云数据类型例程: 

///////////////////////////////////////////////////////////////
#define PCL_NO_PRECOMPILE //这个宏必须要加啊!!!!!
///////////////////////////////////////////////////////////////
#include <pcl/memory.h>
#include <pcl/pcl_macros.h>
#include <pcl/point_types.h>
#include <pcl/point_cloud.h>
#include <pcl/io/pcd_io.h>

struct EIGEN_ALIGN16 MyPointType    // enforce SSE padding for correct memory alignment
{
  PCL_ADD_POINT4D;                  // preferred way of adding a XYZ+padding
  float test;
  PCL_MAKE_ALIGNED_OPERATOR_NEW     // make sure our new allocators are aligned
};

POINT_CLOUD_REGISTER_POINT_STRUCT (MyPointType,           // here we assume a XYZ + "test" (as fields)
                                   (float, x, x)
                                   (float, y, y)
                                   (float, z, z)
                                   (float, test, test)
)


int
main (int argc, char** argv)
{
  pcl::PointCloud<MyPointType> cloud;
  cloud.resize (2);
  cloud.width = 2;
  cloud.height = 1;

  cloud[0].test = 1;
  cloud[1].test = 2;
  cloud[0].x = cloud[0].y = cloud[0].z = 0;
  cloud[1].x = cloud[1].y = cloud[1].z = 3;

  pcl::io::savePCDFile ("test.pcd", cloud);
}

即:在你项目的main函数中,在包含pcl库头文件之前,加上该宏——

#define PCL_NO_PRECOMPILE

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐