在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