• 【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
  • 相关阅读:
    1-31 正则表达式 String Buffer String Builder
    JDBC详解
    mmdetection3d
    推荐一个基于.Net Framework开发的Windows右键菜单管理工具
    kubernetes集群部署(v1.23.5)
    CentOS7 安装Oracle RAC 19c PRVF-5493,PRVG-13606 PRVG-1019 的问题解决
    flask框架
    如何禁止员工安装软件|公司电脑如何限制安装软件
    红海有鱼群,共话医疗器械行业之渠道开发
    河北建筑八大员资料员施工员劳务员题库练习
  • 原文地址:https://blog.csdn.net/qq_43557907/article/details/126755817