作者: zhch_pan
原文鏈接:https://www.cnblogs.com/zhchp-blog/p/7249487.html/
出處: 博客園
轉載說明:如有侵權,請聯繫我刪除,謝謝!
-
ROS版本爲indigo,PCL庫版本 1.7,gcc版本是5.4.0(gcc只有4.7及以上的版本才支持c++11的編譯格式)
-
如果代碼裏有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")
- 經過測試,非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)