Cartographer編譯方法及編譯出錯(glog庫鏈接錯誤)解決方法

最近在重新調試Carto代碼,想把自己的代碼加入到Carto中,原本想在IDE中調試,然而Carto編譯方式比較奇葩(

catkin_make_isolated --install --use-ninja)試了Clion、VScode、Qt(ros版)編譯都會出問題。

不過Clion講道理應該是可以編譯的,不過要安裝插件,由於我的版本太低了,就放棄了。具體參考https://github.com/larics/cartographer_superbuild。

最後只能在命令行編譯,使用glog將中間變量值保存下來用來調試,有更好的調試方法的小夥伴可以留言~

按照官網步驟按照完成好Carto,參考

https://google-cartographer-ros.readthedocs.io/en/latest/compilation.html

編譯完成並沒有報錯,然而在跑例程的時候節點會直接死掉

roslaunch cartographer_ros offline_backpack_2d.launch bag_filenames:=/home/le/b2-2016-04-05-14-44-52.bag 
... logging to /home/le/.ros/log/b7666ebc-0b88-11ea-a0d3-1831bf0f22e1/roslaunch-God-9181.log
Checking log directory for disk usage. This may take awhile.
Press Ctrl-C to interrupt
Done checking log file disk usage. Usage is <1GB.

started roslaunch server http://localhost:41953/

SUMMARY
========

PARAMETERS
 * /rosdistro: kinetic
 * /rosversion: 1.12.14
 * /use_sim_time: True

NODES
  /
    cartographer_occupancy_grid_node (cartographer_ros/cartographer_occupancy_grid_node)
    cartographer_offline_node (cartographer_ros/cartographer_offline_node)
    rviz (rviz/rviz)

ROS_MASTER_URI=http://localhost:11311

WARNING: Package name "GNSS_INS" does not follow the naming conventions. It should start with a lower case letter and only contain lower case letters, digits, underscores, and dashes.
process[rviz-1]: started with pid [9198]
process[cartographer_occupancy_grid_node-2]: started with pid [9199]
process[cartographer_offline_node-3]: started with pid [9200]
/home/le/cartographer/install_isolated/lib/cartographer_ros/cartographer_offline_node: symbol lookup error: /home/le/cartographer/install_isolated/lib/cartographer_ros/cartographer_offline_node: undefined symbol: _ZN6google7LogSink8ToStringB5cxx11EiPKciPK2tmS2_mi
[cartographer_offline_node-3] process has died [pid 9200, exit code 127, cmd /home/le/cartographer/install_isolated/lib/cartographer_ros/cartographer_offline_node -configuration_directory /home/le/cartographer/install_isolated/share/cartographer_ros/configuration_files -configuration_basenames backpack_2d.lua -urdf_filenames /home/le/cartographer/install_isolated/share/cartographer_ros/urdf/backpack_2d.urdf -bag_filenames /home/le/b2-2016-04-05-14-44-52.bag echoes:=horizontal_laser_2d __name:=cartographer_offline_node __log:=/home/le/.ros/log/b7666ebc-0b88-11ea-a0d3-1831bf0f22e1/cartographer_offline_node-3.log].
log file: /home/le/.ros/log/b7666ebc-0b88-11ea-a0d3-1831bf0f22e1/cartographer_offline_node-3*.log

其中symbol lookup error表示沒有鏈接到指定庫上,然而查看多次都可以看見已經安裝了glog庫

又重新將Carto編譯了一遍,然後在編譯過程中出現如下失敗,但是編譯可以通過,之前並沒有發現

 Failed to find installed gflags CMake configuration, searching for gflags build directories exported with CMake.
-- Failed to find an installed/exported CMake configuration for gflags, will perform search for installed gflags components.
-- Performing Test GFLAGS_IN_GOOGLE_NAMESPACE
-- Performing Test GFLAGS_IN_GOOGLE_NAMESPACE - Success
-- Found Gflags: /usr/include  
-- Found Google Flags header in: /usr/include, in namespace: google
-- No preference for use of exported glog CMake configuration set, and no hints for include/library directories provided. Defaulting to preferring an installed/exported glog CMake configuration if available.
-- Failed to find installed glog CMake configuration, searching for glog build directories exported with CMake.
-- Failed to find an installed/exported CMake configuration for glog, will perform search for installed glog components.
-- Found Glog: /usr/local/include  
-- Found Google Log (glog). Assuming glog was built with gflags support as gflags was found. This will make gflags a public dependency of Ceres.
-- Building with OpenMP.
-- Performing Test COMPILER_HAS_CXX11_FLAG
-- Performing Test COMPILER_HAS_CXX11_FLAG - Success
-- Looking for C++ include unordered_map
-- Looking for C++ include unordered_map - not found
-- Looking for C++ include tr1/unordered_map
-- Looking for C++ include tr1/unordered_map - found
-- Found tr1/unordered_map/set in std::tr1 namespace.
-- Looking for C++ include memory
-- Looking for C++ include memory - found
-- Performing Test HAVE_SHARED_PTR_IN_STD_NAMESPACE
-- Performing Test HAVE_SHARED_PTR_IN_STD_NAMESPACE - Failed
-- Performing Test HAVE_SHARED_PTR_IN_TR1_NAMESPACE
-- Performing Test HAVE_SHARED_PTR_IN_TR1_NAMESPACE - Failed
-- Looking for C++ include tr1/memory
-- Looking for C++ include tr1/memory - found
-- Performing Test HAVE_SHARED_PTR_IN_TR1_NAMESPACE_FROM_TR1_MEMORY_HEADER
-- Performing Test HAVE_SHARED_PTR_IN_TR1_NAMESPACE_FROM_TR1_MEMORY_HEADER - Success
-- Found shared_ptr in std::tr1 namespace using <tr1/memory> header.
-- Building Ceres as a static library.

後來分析發現,比較坑爹的是 carto中的庫,無論是abls還是glog都是使用它自己稍微有點改動的,並不是普通的那種,找了一下午加一晚上終於發現了問題

到~/cartographer/install_isolated/lib/cartographer_ros文件夾下,使用ldd命令查看ros節點對應的鏈接庫

 ldd cartographer_node |grep glog

得到輸出(這個是修改好的正確的,之前報錯的時候,庫鏈接到的是usr/local裏面自己下載的部分)

libglog.so.0 => /usr/lib/x86_64-linux-gnu/libglog.so.0 (0x00007f38d53a2000)

 可以修改cmakelist改變庫的鏈接 或者將原本多安裝的其他版本的glog庫卸載

卸載的方法可以底下的參考博客,要根據你的安裝方法來卸載

1、使用sudo apt-get install libgoogle-glog-dev安裝則可以直接使用sudo apt-get remove libgoogle-glog-dev來卸載,比較方便

2、如果像我一樣使用的是源碼安裝的話,則可以先通過

locate glog

來確定安裝位置,一般是在

~$ locate glog
/usr/local/include/glog
/usr/local/include/glog/config.h
/usr/local/include/glog/log_severity.h
/usr/local/include/glog/logging.h
/usr/local/include/glog/raw_logging.h
/usr/local/include/glog/stl_logging.h
/usr/local/include/glog/vlog_is_on.h
/usr/local/lib/libglog.a
/usr/local/lib/cmake/glog

接着執行

sudo rm -rf /usr/local/include/glog/
sudo rm -rf /usr/local/lib/libglog*

就成功把glog卸載了

之後再將這三個文件夾刪除再重新編譯一般carto即可

Caption

 

 

參考

https://answers.ros.org/question/300549/failed-to-install-google-cartographer/

https://blog.csdn.net/guangyacyb/article/details/85165231

https://blog.csdn.net/u012348774/article/details/80620685

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章