ROS初學筆記 - C++11與PCL庫衝突問題

作者: zhch_pan
原文鏈接:https://www.cnblogs.com/zhchp-blog/p/7249487.html/
出處: 博客園
轉載說明:如有侵權,請聯繫我刪除,謝謝!

  1. ROS版本爲indigo,PCL庫版本 1.7,gcc版本是5.4.0(gcc只有4.7及以上的版本才支持c++11的編譯格式)

  2. 如果代碼裏有c++11格式的語句,比如:

for (auto p:cloud.points)
{
    // 將點雲裏的點插入到octomap中
    tree.updateNode( octomap::point3d(p.x, p.y, p.z), true );
}

則在編譯的時候,應在CMakeLists.txt中加入

SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
  1. 經過測試,非ROS工作空間中,使用cmake … / make 方式編譯,編譯格式是否爲c++11與pcl並沒有衝突,但是如果在ROS工作空間中,用catkin_make編譯時,如果編譯格式設置爲c++11,則有些用到pcl的時候會出現報錯:

段錯誤(核心已轉儲) segmentation fault (core dumped)

例如我遇到的一個情況:

在一個ROS-package中,因爲要對點雲進行濾波操作(Removing outliers using a Conditional or RadiusOutlier removal),新建remove_outliers.cpp,其中包含頭文件

#include <pcl/filters/radius_outlier_removal.h>
#include <pcl/filters/conditional_removal.h>

同時我的CMakeLists.txt中之前設置了編譯格式爲支持c++11(

  SET(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

),

使用catkin_make編譯通過後,一旦rosrun該節點,直接出現“段錯誤(核心已轉儲)”,去掉這倆頭文件,便可以正常運行節點,但是也無法做濾波了。

解決方案:

同一個workspace下,創建一個新的功能包,單獨編譯該濾波node.
同時 新建pkg 的CMakeLists.txt保留默認格式(不使用C++11)

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