0.前言
这段时间开始学习使用cmake配各种包,在这里记录下来一些过程方便回顾。
本节讨论引用第三方库和导出自己的库
1.引入外部库
例如,我们从 github 上 clone 了 ompl 库,想要在自己的 package 中使用它,该如何做到呢?
首先,将 ompl 包 和自己的 pkg 包放在工作空间的 src 目录下,并提前编译好 ompl:
colcon build --packages-select ompl
在我们 pkg 功能包的 CMakeFiles 文件中添加以下代码:
find_package(ompl REQUIRED)
find_package
会自动定位并载入指定库的配置文件,首先在当前的层级目录(install文件夹)中查询,如果没有找到则去系统目录中(usr/local/share)继续查找(所以当同时用二进制安装和源码编译后,优先使用的是源码)。
(REQUIRED:可选字段。表示一定要找到包,找不到的话就立即停掉整个CMake。而如果不指定REQUIRED则CMake会继续执行。)
在查找完成后,会返回几个关键字:
- <LibaryName>_FOUND
用于判断是否成功找到目标功能包 - <LibaryName>_INCLUDE_DIR or <LibaryName>_INCLUDES
包含头文件的文件夹所在路径 - <LibaryName>_LIBRARY or <LibaryName>_LIBRARIES
库文件所在路径
想要看关键字具体索引到的路径地址,可以通过:
message(STATUS "find OMPL_INCLUDE:${OMPL_INCLUDE_DIRS}")
message(STATUS "find OMPL_LIB:${OMPL_LIBRARIES}")
来查看。由于我们使用colcon build 进行编译,所以输出的日志信息会被储存到工作空间下的 log 文件夹中,进入对应日期时间的文件夹后打开 stdout 文件即可。
然后,我们导入目标库的头文件和库文件:
include_directories(
${
OMPL_INCLUDE_DIRS}
)
add_executable(ompl_test_node
src/ompl_test_node.cpp
)
target_link_libraries(ompl_test_node
${
OMPL_LIBRARIES}
)
这样,我们成功引入了头文件,并将库文件成功链接到了目标可执行文件上。
2.导出自定义库
此部分参考文章:https://zhuanlan.zhihu.com/p/87738686
反过来,我们也可以让他人或将来的自己通过 find_package() 使用我们的模块。
对于导出动态库的方法,将上述add_executable
改为add_library
即可
add_library(omcl_ros2 SHARED
src/ompl_test_node.cpp
src/fcl_test_node.cpp
)
ament_target_dependencies(omcl_ros2
rclcpp
)
target_link_libraries(omcl_ros2
${
OMPL_LIBRARIES}
${
FCL_LIBRARIES}
)
install(TARGETS
omcl_ros2
DESTINATION lib/${
PROJECT_NAME}
)
通过 install
即可将动态库安装到 lib 文件夹中。在其它包中调用的时候,就可以通过 find_package 获取到该动态库的路径。
最后再 install 头文件即可:
install(DIRECTORY
include/${
PROJECT_NAME}
DESTINATION include
)