关于catkin_make的一些学习笔记(持更)
(此博文为新手自学笔记,只是浅显理解并不保证准确性,后期有更深入的了解会更新内容,欢迎指正博文中的错误~)
- 习惯上,在该package目录下新建include文件夹,专门存放头文件,比如:PACKAGE_NAME / include / Library_name / HEAD_1.h
- 头文件中函数或者类的具体实现放在.cpp文件中,习惯与节点源码放在一起,比如:PACKAGE_NAME / src / HEAD_1.cpp
- 在CmakLists.txt中添加库:
catkin_package( ... INCLUDE_DIRS include LIBRARIES Library_name ... ) add_library(Library_name src/HEAD_1.cpp src/HEAD_2.cpp ... }
4.库编译完后,在其他.cpp中如果用到了这个库,就可以在编译的时候添加这个库的链接:
add_executable(node_name src/node_name.cpp)
add_dependencies(node_name Library_name)
target_link_libraries(node_name Library_name ${catkin_LIBRARIES} )
1. 我的ROS版本为indigo,PCL库版本 1.7,gcc版本是4.8.4(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")
3.经过测试,非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下,catkin_creat_pkg一个新的pkg单独编译该滤波node,同时该pkg的CMakeLists.txt不要指定编译格式(其实默认就是没有设置的)
总结:
>ROS中用到跟pcl库有关的调用时,最好建个pkg将跟pcl有关的节点放在里面,避免出现跟c++11的冲突,因为有些其他的pkg编译时可能需要c++11的支持,
这时如果又在同一个pkg里引用一些pcl库时,一旦出现我这种情况是很蛋疼的,刚开始我都不知道哪儿出问题了,找了好久原因。