当前位置: 华文星空 > 知识

ROS怎么引用动态库?

2021-11-18知识

在ROS开发中经常要定义动态库供其他包调用。分享一下,在ROS中创建和使用动态库的经验。

一、创建动态库

1.创建名为lib_test的ROS包,依赖roscpp

catkin_create_pkg lib_test roscpp

2.添加动态库的头文件libheader.h,其他包使用该库时需要引用

#ifndef LIBHEADER_H #define LIBHEADER_H int LibFunc ( int a , int b ); #endif // LIBHEADER_H

3.添加动态库的实现文件libmain.cpp

#include "lib_test/libheader.h" #include <ros/ros.h> int LibFunc ( int a , int b ){ ROS_INFO ( "LibFunc is called %d" , a + b ); return a + b ; }

4.修改CMakelist.txt文件几处关键配置,将lib_test包编译为一个动态库

#添加要编译的文件 file ( GLOB_RECURSE SRCS *.cpp ) set ( SOURCE_FILES ${ SRCS } ) ################################### ## catkin specific configuration ## ################################### ## The catkin_package macro generates cmake config files for your package ## Declare things to be passed to dependent projects ## INCLUDE_DIRS: uncomment this if your package contains header files ## LIBRARIES: libraries you create in this project that dependent projects also need ## CATKIN_DEPENDS: catkin_packages dependent projects also need ## DEPENDS: system dependencies of this project that dependent projects also need catkin_package ( INCLUDE_DIRS include #对外发布动态库的头文件(这里配错其他包将无法引用) LIBRARIES lib_test #对外发布动态库库名(这里配错其他包将无法引用) # CATKIN_DEPENDS roscpp # DEPENDS system_lib ) #自身编译需要的头文件目录 include_directories ( # include ${ catkin_INCLUDE_DIRS } ${ CMAKE_CURRENT_SOURCE_DIR } /include ) #将本包编译成动态库 add_library ( ${ PROJECT_NAME } ${ SOURCE_FILES } ) target_link_libraries ( ${ PROJECT_NAME } ${ catkin_LIBRARIES } )

5.目录结构如下

lib_test/ ├── CMakeLists.txt ├── include │ └── lib_test │ └── libheader.h ├── package.xml └── src └── libmain.cpp

二、使用动态库

1.创建名为uselib的ROS包,依赖roscpp和上面创建的libtest包

catkin_create_pkg use_lib roscpp lib_test

2.修改CMakelist.txt文件几处关键配置,添加对libtest动态库的依赖

#添加要编译的文件 file ( GLOB_RECURSE SRCS *.cpp ) set ( SOURCE_FILES ${ SRCS } ) ################################### ## catkin specific configuration ## ################################### ## The catkin_package macro generates cmake config files for your package ## Declare things to be passed to dependent projects ## INCLUDE_DIRS: uncomment this if your package contains header files ## LIBRARIES: libraries you create in this project that dependent projects also need ## CATKIN_DEPENDS: catkin_packages dependent projects also need ## DEPENDS: system dependencies of this project that dependent projects also need catkin_package ( # INCLUDE_DIRS include # LIBRARIES use_lib CATKIN_DEPENDS lib_test roscpp #添加对lib_test动态库的依赖 # DEPENDS system_lib ) #自身编译需要的头文件目录 include_directories ( # include ${ catkin_INCLUDE_DIRS } ${ CMAKE_CURRENT_SOURCE_DIR } /include ) #将本包编译成可执行文件 add_executable ( ${ PROJECT_NAME } ${ SOURCE_FILES } ) target_link_libraries ( ${ PROJECT_NAME } ${ catkin_LIBRARIES } )

3.添加使用动态库的实现文件main.cpp

#include "lib_test/libheader.h" #include <ros/ros.h> int main ( int argc , char ** argv ){ int result = LibFunc ( 1 , 2 ); ROS_INFO ( "result = %d" , result ); }

4.目录结构如下

use_lib/ ├── CMakeLists.txt ├── include │ └── use_lib ├── package.xml └── src └── main.cpp

三、编译运行结果

catkin build lib_test catkin build use_lib source devel/setup.bash rosrun use_lib use_lib [ INFO] [ 1636106179.816962716] : LibFunc is called 3 [ INFO] [ 1636106179.816992236] : result = 3