初学ROS遇到的大部分问题,到最后都是简单的多加了依赖,少加了依赖,这可能会导致编译不通过,也可能编译通过但是会有核心转储的错,光看程序完全看不出来问题,浪费了很多时间。所以我打算细致地整理一下。
参考:
http://docs.ros.org/indigo/api/catkin/html/howto/format2/system_library_dependencies.html
http://wiki.ros.org/catkin/CMakeLists.txt
功能包的依赖部分涉及到cmakelist.txt和package.xml两个文件。两个文件分别要对依赖进行声明
cmakelist.txt一般为这样:
cmake_minimum_required(VERSION 2.8.3)
project(cv_bridge_tutorial_pkg)
find_package(catkin REQUIRED COMPONENTS
cv_bridge
image_transport
roscpp
sensor_msgs
std_msgs
)
find_package( OpenCV REQUIRED )
catkin_package()
include_directories(
${catkin_INCLUDE_DIRS}
${OpenCV_INCLUDE_DIRS}
)
add_executable(sample_cv_bridge_node src/sample_cv_bridge_node.cpp)
target_link_libraries(sample_cv_bridge_node
${catkin_LIBRARIES}
${OpenCV_LIBRARIES}
)
include_directories(${catkin_INCLUDE_DIRS} ${OpenCV_INCLUDE_DIRS})
一般来讲在IDE配置库主要是两个部分,一个是动态链接库,一个是头文件包含。ROS也是这样。
链接库:
find_package()的作用是让cmake找到依赖的库,像boost,opencv这种普遍在用的库,已经提供了CMake模块,运行时不需要单独的共享库,只需要写成 find_package( OpenCV REQUIRED )、find_package(Boost REQUIRED)就可以了。但是有些功能就需要单独的库,比如boot线程实现以及大部分功能包依赖,写成find_package(Boost REQUIRED COMPONENTS thread)。 如果没有Cmake模块可用,但是库的开发包提供了pkg-config文件。写成find_package(PkgConfig REQUIRED)
pkg_check_modules(GSTREAMER REQUIRED libgstreamer-0.10)
头文件包含:
include_directories(include ${Boost_INCLUDE_DIRS} ${GSTREAMER_INCLUDE_DIRS})
导出接口:
catkin_package(0 这里需要和package.xml的<build_export_depend> 或 一致
传递
传递兼容的CMake变量:find_package(boost…)、 catkin_package(DEPENDS Boost)
内部使用, 没有生成兼容的CMake变量,不在暴露的头文件中 find_package(PythonLibs…) ${PYTHON_INCLUDE_PATH}
一般而言的第三方功能包 只需要依赖其消息文件即可 依赖主体节点会有很大的问题。
package.xml
<?xml version="1.0"?>
<package format="2">
<name>cood_tran</name>
<version>0.0.0</version>
<description>The cood_tran package</description>
<maintainer email="qiuyilin@todo.todo">qiuyilin</maintainer>
<license>TODO</license>
<buildtool_depend>catkin</buildtool_depend>
<build_depend>darknet_ros_msgs</build_depend>
<build_depend>sensor_msgs</build_depend>
<build_depend>roscpp</build_depend>
<build_depend>cv_bridge</build_depend>
<build_depend>image_transport</build_depend>
<build_depend>std_msgs</build_depend>
<build_export_depend>darknet_ros_msgs</build_export_depend>
<build_export_depend>sensor_msgs</build_export_depend>
<build_export_depend>roscpp</build_export_depend>
<build_export_depend>cv_bridge</build_export_depend>
<build_export_depend>image_transport</build_export_depend>
<build_export_depend>std_msgs</build_export_depend>
<exec_depend>darknet_ros_msgs</exec_depend>
<exec_depend>sensor_msgs</exec_depend>
<exec_depend>roscpp</exec_depend>
<exec_depend>cv_bridge</exec_depend>
<exec_depend>image_transport</exec_depend>
<exec_depend>std_msgs</exec_depend>
<!-- The export tag contains other, unspecified, tags -->
<export>
<!-- Other tools can request additional information be placed here -->
</export>
</package>
<build_depend>
构建程序所需要的依赖
<build_export_depend>
其他程序需要build_depend的功能包
<exec_depend>
用于 shared libraries, executables, Python modules, launch scripts and other files required for running your package
不推荐使用