ROS C++ Package打包成.so动态库以及使用方法
C++代码封装成.so库
封装前准备工作
对于文件夹结构如下的C++ ros包,在编译前build和devel文件夹为空,example_package是要进行封装的程序包,在封装前要保证:1.程序编译和功能没问题;2.函数的声明在example.h文件或example_core.h文件内,定义全部在example.cpp文件或example_core.cpp内,example_node.cpp文件只有main函数引用和使用类。
catkin_workspace
├─build
├─devel
└─src
└─example_package
├─include
│ ├─example.h
│ └─example_core.h
├─launch
│ └─example.launch
├─src
│ ├─example.cpp
│ ├─example_core.cpp
│ └─example_node.cpp
├─CMakeLists.txt
└─package.xml
修改cmakelist
对招以下内容修改cmakelist(复制粘贴一个cmakelist,原来的做一个备份,后面使用库的时候还要用),package.xml不需要修改。其中{example}是编译工程的名字,{Example}是要输出的动态库的名字,要添加或修改的部分已用注释说明
cmake_minimum_required(VERSION 2.8.3)
project(${example})
find_package(
catkin REQUIRED COMPONENTS
#依赖的包不变
)
catkin_package(
INCLUDE_DIRS include
)
SET(CMAKE_CXX_FLAGS "-O2 -g -Wall ${CMAKE_CXX_FLAGS}")
set(ROSLINT_CPP_OPTS "--filter=-build/c++11")
roslint_cpp()
include_directories(
include
${catkin_INCLUDE_DIRS}
)
#这条注释以上的内容都不需要修改
# 这里要修改,library
add_library(${Example} SHARED
src/example_core.cpp
src/example.cpp
)
#这里要修改install
install(
TARGETS ${Example}
EXPORT export_${example}
ARCHIVE DESTINATION lib
LIBRARY DESTINATION lib
RUNTIME DESTINATION bin
)
target_link_libraries(${Example} ${catkin_LIBRARIES})
修改完成后使用catkin_make进行编译,在devel/lib文件夹下生成libExample.so文件,就是需要的动态库
使用动态库
准备工作
将生成的动态库复制到程序包内,新建lib文件夹,删除example.cpp文件和example_core.cpp,只留下example_node.cpp做调用
catkin_workspace
├─build
├─devel
└─src
└─example_package
├─include
│ ├─example.h
│ └─example_core.h
├─lib
│ └─libExample.so
├─launch
│ └─example.launch
├─src
│ └─example_node.cpp
├─CMakeLists.txt
└─package.xml
修改cmakelist
cmake_minimum_required(VERSION 2.8.3)
project(${example})
find_package(
catkin REQUIRED COMPONENTS
#依赖的包
)
catkin_package(
INCLUDE_DIRS include
)
SET(CMAKE_CXX_FLAGS "-O2 -g -Wall ${CMAKE_CXX_FLAGS}")
set(ROSLINT_CPP_OPTS "--filter=-build/c++11")
roslint_cpp()
include_directories(
include
${catkin_INCLUDE_DIRS}
)
#此注释以上的不需要改
#添加lib到link_directories
link_directories(
lib
${catkin_LIB_DIRS}
)
add_executable(
${example}
src/example_node.cpp
)
#添加与动态库 ${Example}之间的连接,这里${example}和${Example}都要改成自己工程和库的名字
target_link_libraries(${example} ${catkin_LIBRARIES} ${Example})
add_dependencies(${example} ${catkin_EXPORTED_TARGETS})
install(
TARGETS ${example}
ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)
install(
DIRECTORY launch/
DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}/launch
)
修改完cmakelist后,正常编译即可使用