1. 程式人生 > >pcl::io::savePCDFile 報錯 “未定義的引用”

pcl::io::savePCDFile 報錯 “未定義的引用”

電腦平臺:Ubuntu 16.04   64位

boost版本:1.58

pcl版本:1.7

g++/gcc版本:4.8(後改成5.0,才可以通過編譯)

 

跟著做高翔的“一起做RGBD-SLAM“第三講的時候,需要儲存生成的點雲圖,在程式中使用的是下面的一條語句:

pcl::io::savePCDFile( "./data/pointcloud.pcd", *cloud);

但是在在cmake編譯的時候 總會報錯,報錯資訊如下:

[ 87%] Building CXX object src/CMakeFiles/generate_pointcloud.dir/generatePointCloud.cpp.o
[100%] Linking CXX executable ../../bin/generate_pointcloud
CMakeFiles/generate_pointcloud.dir/generatePointCloud.cpp.o:在函式‘pcl::PCDWriter::write(std::string const&, pcl::PCLPointCloud2 const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, Eigen::Quaternion<float, 0> const&, bool)’中:
generatePointCloud.cpp:(.text._ZN3pcl9PCDWriter5writeERKSsRKNS_14PCLPointCloud2ERKN5Eigen6MatrixIfLi4ELi1ELi0ELi4ELi1EEERKNS6_10QuaternionIfLi0EEEb[_ZN3pcl9PCDWriter5writeERKSsRKNS_14PCLPointCloud2ERKN5Eigen6MatrixIfLi4ELi1ELi0ELi4ELi1EEERKNS6_10QuaternionIfLi0EEEb]+0xc):對‘pcl::PCDWriter::writeASCII(std::string const&, pcl::PCLPointCloud2 const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, Eigen::Quaternion<float, 0> const&, int)’未定義的引用
generatePointCloud.cpp:(.text._ZN3pcl9PCDWriter5writeERKSsRKNS_14PCLPointCloud2ERKN5Eigen6MatrixIfLi4ELi1ELi0ELi4ELi1EEERKNS6_10QuaternionIfLi0EEEb[_ZN3pcl9PCDWriter5writeERKSsRKNS_14PCLPointCloud2ERKN5Eigen6MatrixIfLi4ELi1ELi0ELi4ELi1EEERKNS6_10QuaternionIfLi0EEEb]+0x11):對‘pcl::PCDWriter::writeBinary(std::string const&, pcl::PCLPointCloud2 const&, Eigen::Matrix<float, 4, 1, 0, 4, 1> const&, Eigen::Quaternion<float, 0> const&)’未定義的引用
CMakeFiles/generate_pointcloud.dir/generatePointCloud.cpp.o:在函式‘int pcl::PCDWriter::writeASCII<pcl::PointXYZRGBA>(std::string const&, pcl::PointCloud<pcl::PointXYZRGBA> const&, int)’中:
generatePointCloud.cpp:(.text._ZN3pcl9PCDWriter10writeASCIIINS_12PointXYZRGBAEEEiRKSsRKNS_10PointCloudIT_EEi[_ZN3pcl9PCDWriter10writeASCIIINS_12PointXYZRGBAEEEiRKSsRKNS_10PointCloudIT_EEi]+0xd5):對‘pcl::PCDWriter::setLockingPermissions(std::string const&, boost::interprocess::file_lock&)’未定義的引用
generatePointCloud.cpp:(.text._ZN3pcl9PCDWriter10writeASCIIINS_12PointXYZRGBAEEEiRKSsRKNS_10PointCloudIT_EEi[_ZN3pcl9PCDWriter10writeASCIIINS_12PointXYZRGBAEEEiRKSsRKNS_10PointCloudIT_EEi]+0x78e):對‘pcl::PCDWriter::resetLockingPermissions(std::string const&, boost::interprocess::file_lock&)’未定義的引用
CMakeFiles/generate_pointcloud.dir/generatePointCloud.cpp.o:在函式‘int pcl::PCDWriter::writeBinary<pcl::PointXYZRGBA>(std::string const&, pcl::PointCloud<pcl::PointXYZRGBA> const&)’中:
generatePointCloud.cpp:(.text._ZN3pcl9PCDWriter11writeBinaryINS_12PointXYZRGBAEEEiRKSsRKNS_10PointCloudIT_EE[_ZN3pcl9PCDWriter11writeBinaryINS_12PointXYZRGBAEEEiRKSsRKNS_10PointCloudIT_EE]+0xf0):對‘pcl::PCDWriter::setLockingPermissions(std::string const&, boost::interprocess::file_lock&)’未定義的引用
generatePointCloud.cpp:(.text._ZN3pcl9PCDWriter11writeBinaryINS_12PointXYZRGBAEEEiRKSsRKNS_10PointCloudIT_EE[_ZN3pcl9PCDWriter11writeBinaryINS_12PointXYZRGBAEEEiRKSsRKNS_10PointCloudIT_EE]+0x516):對‘pcl::PCDWriter::resetLockingPermissions(std::string const&, boost::interprocess::file_lock&)’未定義的引用
generatePointCloud.cpp:(.text._ZN3pcl9PCDWriter11writeBinaryINS_12PointXYZRGBAEEEiRKSsRKNS_10PointCloudIT_EE[_ZN3pcl9PCDWriter11writeBinaryINS_12PointXYZRGBAEEEiRKSsRKNS_10PointCloudIT_EE]+0x73c):對‘pcl::PCDWriter::resetLockingPermissions(std::string const&, boost::interprocess::file_lock&)’未定義的引用
generatePointCloud.cpp:(.text._ZN3pcl9PCDWriter11writeBinaryINS_12PointXYZRGBAEEEiRKSsRKNS_10PointCloudIT_EE[_ZN3pcl9PCDWriter11writeBinaryINS_12PointXYZRGBAEEEiRKSsRKNS_10PointCloudIT_EE]+0x7ca):對‘pcl::PCDWriter::resetLockingPermissions(std::string const&, boost::interprocess::file_lock&)’未定義的引用
generatePointCloud.cpp:(.text._ZN3pcl9PCDWriter11writeBinaryINS_12PointXYZRGBAEEEiRKSsRKNS_10PointCloudIT_EE[_ZN3pcl9PCDWriter11writeBinaryINS_12PointXYZRGBAEEEiRKSsRKNS_10PointCloudIT_EE]+0x8b5):對‘pcl::PCDWriter::resetLockingPermissions(std::string const&, boost::interprocess::file_lock&)’未定義的引用
generatePointCloud.cpp:(.text._ZN3pcl9PCDWriter11writeBinaryINS_12PointXYZRGBAEEEiRKSsRKNS_10PointCloudIT_EE[_ZN3pcl9PCDWriter11writeBinaryINS_12PointXYZRGBAEEEiRKSsRKNS_10PointCloudIT_EE]+0x94e):對‘pcl::PCDWriter::resetLockingPermissions(std::string const&, boost::interprocess::file_lock&)’未定義的引用
collect2: error: ld returned 1 exit status
src/CMakeFiles/generate_pointcloud.dir/build.make:437: recipe for target '../bin/generate_pointcloud' failed
make[2]: *** [../bin/generate_pointcloud] Error 1
CMakeFiles/Makefile2:202: recipe for target 'src/CMakeFiles/generate_pointcloud.dir/all' failed
make[1]: *** [src/CMakeFiles/generate_pointcloud.dir/all] Error 2
Makefile:83: recipe for target 'all' failed
make: *** [all] Error 2

排查過程:

猜測1:懷疑   src/CMakeLists.txt  中對pcl 的引用方式有錯

   在Ubuntu14.04中,不需要新增修復指令,但是在Ubuntu 16.04中,需要在  src/CMakeLists.txt  中新增一條修復指令,詳見如下:

# 增加PCL庫的依賴
FIND_PACKAGE( PCL REQUIRED COMPONENTS common io visualization )

list(REMOVE_ITEM PCL_LIBRARIES "vtkproj4") # use this in Ubuntu 16.04

# 新增標頭檔案和庫檔案
ADD_DEFINITIONS( ${PCL_DEFINITIONS} )
INCLUDE_DIRECTORIES( ${PCL_INCLUDE_DIRS}  )
LINK_LIBRARIES( ${PCL_LIBRARY_DIRS} )

list(REMOVE_ITEM PCL_LIBRARIES "vtkproj4") # use this in Ubuntu 16.04

標紅的這句 就是修復指令。但是寫上還是不行

猜測2:pcl安裝有問題

先從高翔的github上下載了源程式,裡面有已經生成的pointcloud.pcd檔案,假如說pcl庫沒有安裝好,那麼是打不開點雲圖的,所以就進入到pointcloud.pcd所在的資料夾下面,命令如下:

pcl_viewer pointcloud.pcd 

結果,出來點雲圖了,說明安裝的pcl庫是沒問題的

猜測3:g++/gcc 的版本不對

在之前安裝opencv3的時候,也遇到過”未定義的引用“這類的問題,當時是我電腦上g++/gcc的版本是5.0,降低到4.8版本之後,才完成了opencv3的安裝,之後也沒有改回來。所以抱著試試的態度,把g++/gcc版本改回來

修改方法,參考我的另一篇:Ubuntu中g++ gcc安裝及版本切換

修改到5.0版本之後,再次編譯,結果  就通過編譯了!!!

簡直太開心了!!!感謝我乖寶滴陪伴~程式設計師  永不認輸!!!