编译绝缘子识别代码出现的问题及其解决方法
编译时报错:
CMakeFiles/recognition.dir/src/recognition_core.cpp.o: In function `EuClusterCore::point_cb(boost::shared_ptr<sensor_msgs::PointCloud2_<std::allocator<void> > const> const&)':
recognition_core.cpp:(.text+0x1e1c): undefined reference to `pcl::GeometricConsistencyGrouping<pcl::PointXYZ, pcl::PointXYZ>::recognize(std::vector<Eigen::Matrix<float, 4, 4, 0, 4, 4>, Eigen::aligned_allocator<Eigen::Matrix<float, 4, 4, 0, 4, 4> > >&, std::vector<std::vector<pcl::Correspondence, Eigen::aligned_allocator<pcl::Correspondence> >, std::allocator<std::vector<pcl::Correspondence, Eigen::aligned_allocator<pcl::Correspondence> > > >&)'
CMakeFiles/recognition.dir/src/recognition_core.cpp.o:(.data.rel.ro._ZTVN3pcl28GeometricConsistencyGroupingINS_8PointXYZES1_EE[_ZTVN3pcl28GeometricConsistencyGroupingINS_8PointXYZES1_EE]+0x58): undefined reference to `pcl::GeometricConsistencyGrouping<pcl::PointXYZ, pcl::PointXYZ>::clusterCorrespondences(std::vector<std::vector<pcl::Correspondence, Eigen::aligned_allocator<pcl::Correspondence> >, std::allocator<std::vector<pcl::Correspondence, Eigen::aligned_allocator<pcl::Correspondence> > > >&)'
collect2: error: ld returned 1 exit status
pkg_recognition/CMakeFiles/recognition.dir/build.make:333: recipe for target '/home/foia/ws_pointcloudfilter/devel/lib/pkg_recognition/recognition' failed
make[2]: *** [/home/foia/ws_pointcloudfilter/devel/lib/pkg_recognition/recognition] Error 1
CMakeFiles/Makefile2:3050: recipe for target 'pkg_recognition/CMakeFiles/recognition.dir/all' failed
make[1]: *** [pkg_recognition/CMakeFiles/recognition.dir/all] Error 2
Makefile:159: recipe for target 'all' failed
make: *** [all] Error 2
Invoking "make -j6 -l6" failed
错误主要为:
undefined reference to `pcl::GeometricConsistencyGrouping<pcl::PointXYZ, pcl::PointXYZ>
解决方案:
在××.cpp文件里加入缺少文件的**.hpp(对应**.h)
添加#include <pcl/recognition/impl/cg/geometric_consistency.hpp>
对应于#include <pcl/recognition/cg/geometric_consistency.h>
换成hough-3d方法试了一下,结果报错:
undefined reference to `pcl::recognition::HoughSpace3D<pcl::PointXYZ, pcl::PointXYZ>
解决方法:
修改cmakelists.txt文件,将pcl的库添加进去:
(这个方法对上面那个问题也是适用的)
cmake_minimum_required(VERSION 3.0.2)
project(pkg_recognition)
find_package(catkin REQUIRED COMPONENTS
jsk_recognition_msgs
pcl_conversions
pcl_ros
roscpp
sensor_msgs
std_msgs
)
find_package(PCL 1.8 REQUIRED)
set(PCL_INCLUDE_DIRS /usr/include/pcl-1.8)
catkin_package(
# INCLUDE_DIRS include
# LIBRARIES pkg_recognition
CATKIN_DEPENDS jsk_recognition_msgs pcl_conversions pcl_ros roscpp sensor_msgs std_msgs
# DEPENDS system_lib
)
include_directories(
# include
${catkin_INCLUDE_DIRS}
${PCL_INCLUDE_DIRS}
)
target_link_libraries(recognition ${catkin_LIBRARIES} ${PCL_LIBRARIES})