在ubuntu下对ROS进行编程很经常的会用到动态链接库的调用,而ROS中的编译系统为catkin_make,和常规的CMake略有不同,具体不同点可参考这篇博客(点击打开链接),这就需要正确配置CMakelists.txt文件,以便编译系统找到你引用的库和头文件。
总的来说其实很简单,下面将列举详细步骤和实例。
比如我需要引用一个动态链接库名字为libRobotBus.so。
与其对应的头文件有:
BytesObject.h
Common.h
DataObject.h
MessageBlock.h
MessageSerializable.h
MotorID.h
RobotMessage.h
RobotSession.h
1.将动态链接库(so文件)以及对应的头文件都保存到某一个文件夹.
这里我直接将其保存在我的工作空间的库文件夹中(include/test_so),我的工作空间(3_so_test_ws)的文件树如下所示:
└── src
├── CMakeLists.txt -> /opt/ros/indigo/share/catkin/cmake/toplevel.cmake
└── test_so
├── CMakeLists.txt
├── CMakeLists.txt~
├── include
│ └── test_so
│ ├── BytesObject.h
│ ├── Common.h
│ ├── DataObject.h
│ ├── libRobotBus.so
│ ├── MessageBlock.h
│ ├── MessageSerializable.h
│ ├── MotorID.h
│ ├── RobotMessage.h
│ └── RobotSession.h
├── package.xml
└── src
├── talker.cpp
└── talker.cpp~
2.修改CMakelists.txt文件。
在CMakelists.txt文件中,我们首先需要把这个动态链接库的绝对文件路径告诉编译器,这里增加的语句是:
include_directories(/home/shawn/ipal_files/3_so_test_ws/src/test_so/include/test_so)然后使用target_link_libraries函数来指定可执行文件链接的库。这个要用在add_executable()后面,具体为:
target_link_libraries(talker ${catkin_LIBRARIES} RobotBus)这里编译系统默认的就是so文件,所以只需要添加RobotBus就可以了。
至此已经完成了动态链接库的配置,编译已经可以通过了,而且可以*调用库中的对象及函数了。