背景:
1. 电脑配置:ubuntu16.04, gcc 5.4.0, C++11/14, pcl-1.7.2
2. 将点云写入pcd文件。报错如下,
报错信息:
CMakeFiles/xag_nav_map_display.dir/src/pcl/pointcloud_io.cc.o: In function `pcl::PCDWriter::write(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, pcl::PCLPointCloud2 const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, Eigen::Quaternion<float, 0> const&, bool)': /usr/include/pcl-1.7/pcl/io/pcd_io.h:351: undefined reference to `pcl::PCDWriter::writeBinary(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, pcl::PCLPointCloud2 const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, Eigen::Quaternion<float, 0> const&)' /usr/include/pcl-1.7/pcl/io/pcd_io.h:353: undefined reference to `pcl::PCDWriter::writeASCII(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, pcl::PCLPointCloud2 const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, Eigen::Quaternion<float, 0> const&, int)' CMakeFiles/xag_nav_map_display.dir/src/pcl/pointcloud_io.cc.o: In function `int pcl::PCDWriter::writeASCII<pcl::PointXYZ>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, pcl::PointCloud<pcl::PointXYZ> const&, int)': /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:486: undefined reference to `pcl::PCDWriter::setLockingPermissions(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::interprocess::file_lock&)' /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:598: undefined reference to `pcl::console::print(pcl::console::VERBOSITY_LEVEL, char const*, ...)' /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:613: undefined reference to `pcl::PCDWriter::resetLockingPermissions(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::interprocess::file_lock&)' CMakeFiles/xag_nav_map_display.dir/src/pcl/pointcloud_io.cc.o: In function `int pcl::PCDWriter::writeBinary<pcl::PointXYZ>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, pcl::PointCloud<pcl::PointXYZ> const&)': /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:157: undefined reference to `pcl::PCDWriter::setLockingPermissions(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::interprocess::file_lock&)' /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:193: undefined reference to `pcl::PCDWriter::resetLockingPermissions(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::interprocess::file_lock&)' /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:194: undefined reference to `pcl::console::print(pcl::console::VERBOSITY_LEVEL, char const*, ...)' /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:204: undefined reference to `pcl::PCDWriter::resetLockingPermissions(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::interprocess::file_lock&)' /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:213: undefined reference to `pcl::PCDWriter::resetLockingPermissions(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::interprocess::file_lock&)' /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:247: undefined reference to `pcl::PCDWriter::resetLockingPermissions(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::interprocess::file_lock&)' /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:258: undefined reference to `pcl::PCDWriter::resetLockingPermissions(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::interprocess::file_lock&)' collect2: error: ld returned 1 exit status xag_nav_map_display/CMakeFiles/xag_nav_map_display.dir/build.make:331: recipe for target '/home/gordon/ros_ws/devel/lib/xag_nav_map_display/xag_nav_map_display' failed make[2]: *** [/home/gordon/ros_ws/devel/lib/xag_nav_map_display/xag_nav_map_display] Error 1 CMakeFiles/Makefile2:500: recipe for target 'xag_nav_map_display/CMakeFiles/xag_nav_map_display.dir/all' failed make[1]: *** [xag_nav_map_display/CMakeFiles/xag_nav_map_display.dir/all] Error 2 make[1]: *** Waiting for unfinished jobs.... CMakeFiles/xag_nav_map_playlog.dir/src/pcl/pointcloud_io.cc.o: In function `pcl::PCDWriter::write(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, pcl::PCLPointCloud2 const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, Eigen::Quaternion<float, 0> const&, bool)': /usr/include/pcl-1.7/pcl/io/pcd_io.h:351: undefined reference to `pcl::PCDWriter::writeBinary(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, pcl::PCLPointCloud2 const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, Eigen::Quaternion<float, 0> const&)' /usr/include/pcl-1.7/pcl/io/pcd_io.h:353: undefined reference to `pcl::PCDWriter::writeASCII(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, pcl::PCLPointCloud2 const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, Eigen::Quaternion<float, 0> const&, int)' CMakeFiles/xag_nav_map_playlog.dir/src/pcl/pointcloud_io.cc.o: In function `int pcl::PCDWriter::writeASCII<pcl::PointXYZ>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, pcl::PointCloud<pcl::PointXYZ> const&, int)': /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:486: undefined reference to `pcl::PCDWriter::setLockingPermissions(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::interprocess::file_lock&)' /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:598: undefined reference to `pcl::console::print(pcl::console::VERBOSITY_LEVEL, char const*, ...)' /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:613: undefined reference to `pcl::PCDWriter::resetLockingPermissions(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::interprocess::file_lock&)' CMakeFiles/xag_nav_map_playlog.dir/src/pcl/pointcloud_io.cc.o: In function `int pcl::PCDWriter::writeBinary<pcl::PointXYZ>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, pcl::PointCloud<pcl::PointXYZ> const&)': /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:157: undefined reference to `pcl::PCDWriter::setLockingPermissions(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::interprocess::file_lock&)' /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:193: undefined reference to `pcl::PCDWriter::resetLockingPermissions(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::interprocess::file_lock&)' /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:194: undefined reference to `pcl::console::print(pcl::console::VERBOSITY_LEVEL, char const*, ...)' /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:204: undefined reference to `pcl::PCDWriter::resetLockingPermissions(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::interprocess::file_lock&)' /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:213: undefined reference to `pcl::PCDWriter::resetLockingPermissions(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::interprocess::file_lock&)' /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:247: undefined reference to `pcl::PCDWriter::resetLockingPermissions(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::interprocess::file_lock&)' /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:258: undefined reference to `pcl::PCDWriter::resetLockingPermissions(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::interprocess::file_lock&)' collect2: error: ld returned 1 exit status xag_nav_map_display/CMakeFiles/xag_nav_map_playlog.dir/build.make:331: recipe for target '/home/gordon/ros_ws/devel/lib/xag_nav_map_display/xag_nav_map_playlog' failed make[2]: *** [/home/gordon/ros_ws/devel/lib/xag_nav_map_display/xag_nav_map_playlog] Error 1 CMakeFiles/Makefile2:1149: recipe for target 'xag_nav_map_display/CMakeFiles/xag_nav_map_playlog.dir/all' failed make[1]: *** [xag_nav_map_display/CMakeFiles/xag_nav_map_playlog.dir/all] Error 2 CMakeFiles/xag_nav_map_playback.dir/src/pcl/pointcloud_io.cc.o: In function `pcl::PCDWriter::write(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, pcl::PCLPointCloud2 const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, Eigen::Quaternion<float, 0> const&, bool)': /usr/include/pcl-1.7/pcl/io/pcd_io.h:351: undefined reference to `pcl::PCDWriter::writeBinary(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, pcl::PCLPointCloud2 const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, Eigen::Quaternion<float, 0> const&)' /usr/include/pcl-1.7/pcl/io/pcd_io.h:353: undefined reference to `pcl::PCDWriter::writeASCII(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, pcl::PCLPointCloud2 const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, Eigen::Quaternion<float, 0> const&, int)' CMakeFiles/xag_nav_map_playback.dir/src/pcl/pointcloud_io.cc.o: In function `int pcl::PCDWriter::writeASCII<pcl::PointXYZ>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, pcl::PointCloud<pcl::PointXYZ> const&, int)': /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:486: undefined reference to `pcl::PCDWriter::setLockingPermissions(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::interprocess::file_lock&)' /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:598: undefined reference to `pcl::console::print(pcl::console::VERBOSITY_LEVEL, char const*, ...)' /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:613: undefined reference to `pcl::PCDWriter::resetLockingPermissions(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::interprocess::file_lock&)' CMakeFiles/xag_nav_map_playback.dir/src/pcl/pointcloud_io.cc.o: In function `int pcl::PCDWriter::writeBinary<pcl::PointXYZ>(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, pcl::PointCloud<pcl::PointXYZ> const&)': /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:157: undefined reference to `pcl::PCDWriter::setLockingPermissions(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::interprocess::file_lock&)' /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:193: undefined reference to `pcl::PCDWriter::resetLockingPermissions(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::interprocess::file_lock&)' /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:194: undefined reference to `pcl::console::print(pcl::console::VERBOSITY_LEVEL, char const*, ...)' /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:204: undefined reference to `pcl::PCDWriter::resetLockingPermissions(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::interprocess::file_lock&)' /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:213: undefined reference to `pcl::PCDWriter::resetLockingPermissions(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::interprocess::file_lock&)' /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:247: undefined reference to `pcl::PCDWriter::resetLockingPermissions(std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::interprocess::file_lock&)' /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp:258: undefined reference to ` pcl::PCDWriter::resetLockingPermissions (std::__cxx11::basic_string<char, std::char_traits<char>, std::allocator<char> > const&, boost::interprocess::file_lock&)' collect2: error: ld returned 1 exit status
报错信息中的关键点:
undefined reference to 表示函数有声明,但未找到定义。
collect2: error: ld returned 1 exit status 表示库链接错误。
关于问题解决的猜想:
1. 编译器gcc的版本问题,综合以下2个网址,可能需要匹配gcc-5.0
https://blog.csdn.net/sunshinefcx/article/details/84135794
2. 查看 /usr/include/pcl-1.7/pcl/io/pcd_io.h 和 /usr/include/pcl-1.7/pcl/io/impl/pcd_io.hpp ,确实无法进入相应的函数: pcl::PCDWriter::resetLockingPermissions 和 pcl::PCDWriter::setLockingPermissions 。
推测缺乏相应的函数实现。