• 【CMake】浅谈使用 colcon build 时 CMakeLists 的配置方法-1.使用第三方开源库


    0.前言

    这段时间开始学习使用cmake配各种包,在这里记录下来一些过程方便回顾。
    本节讨论引用第三方库和导出自己的库

    1.引入外部库

    例如,我们从 github 上 clone 了 ompl 库,想要在自己的 package 中使用它,该如何做到呢?
    首先,将 ompl 包 和自己的 pkg 包放在工作空间的 src 目录下,并提前编译好 ompl:

    colcon build --packages-select ompl
    
    • 1

    在我们 pkg 功能包的 CMakeFiles 文件中添加以下代码:

    find_package(ompl REQUIRED)
    
    • 1

    find_package会自动定位并载入指定库的配置文件,首先在当前的层级目录(install文件夹)中查询,如果没有找到则去系统目录中(usr/local/share)继续查找(所以当同时用二进制安装和源码编译后,优先使用的是源码)。

    (REQUIRED:可选字段。表示一定要找到包,找不到的话就立即停掉整个CMake。而如果不指定REQUIRED则CMake会继续执行。)

    在查找完成后,会返回几个关键字:

    1. _FOUND
      用于判断是否成功找到目标功能包
    2. _INCLUDE_DIR or _INCLUDES
      包含头文件的文件夹所在路径
    3. _LIBRARY or _LIBRARIES
      库文件所在路径

    想要看关键字具体索引到的路径地址,可以通过:

    message(STATUS "find OMPL_INCLUDE:${OMPL_INCLUDE_DIRS}")
    message(STATUS "find OMPL_LIB:${OMPL_LIBRARIES}")
    
    • 1
    • 2

    来查看。由于我们使用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}
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    这样,我们成功引入了头文件,并将库文件成功链接到了目标可执行文件上。

    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}
    )
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    通过 install 即可将动态库安装到 lib 文件夹中。在其它包中调用的时候,就可以通过 find_package 获取到该动态库的路径。
    最后再 install 头文件即可:

    install(DIRECTORY 
      include/${PROJECT_NAME}
      DESTINATION include
    )
    
    • 1
    • 2
    • 3
    • 4
  • 相关阅读:
    干货|关于代码无法烧录进入Model3开发板的问题整理
    html+css网页设计 旅游网站首页1个页面
    torch.nn.interpolate—torch上采样和下采样操作
    SpringCloud Gateway--Predicate/断言(详细介绍)中
    项目管理标杆和先驱——华为管理体系(PMP),一文看懂!
    八、面向对象 之 封装
    Java中单链表的指定位置进行插入+寻找中间结点+链表反转
    redis 常见的异常
    【物理应用】基于matlab求解矩形板上二维温度分布【含Matlab源码 2219期】
    【算法题】100019. 将数组分割成最多数目的子数组
  • 原文地址:https://blog.csdn.net/qq_43557907/article/details/126755817