ros下package中CMakelists的编写

2023-05-16

目录

    • 一、package自动生成的Cmakelists
      • 1. 指定cmake版本
      • 2. 项目名字
      • 3. 寻找构建所需依赖包
      • 4. 启用python模块依赖
      • 5. Message/Service/Action 生成文件
      • 6. 启动 message/services/action生成器
      • 7. 指定构建包时的信息输出
      • 8. 生成库或者可执行文件
      • 9. 测试构建
      • 10. 安装
    • 二、关于find_package
    • 三、关于catkin_package
    • 四、关于输出可执行文件和库文件
    • 五、关于add_dependencies
    • 六、关于python 模块支持

一、package自动生成的Cmakelists

1. 指定cmake版本

cmake_minimum_required

示例:

Cmake_minimum_required(version 2.8.3)

2. 项目名字

project()

示例:

project(robot_brain)

3. 寻找构建所需依赖包

find_package

build的时候至少需要一个依赖包:
find_package(catkin REQUIRED)
如果有其他依赖包,可以有如下两种写法:
第一种:

find_package(catkin REQUIRED COMPONENTS ***)

第二种:

find_package(catkin REQUIRED)
find_package(*** REQUIRED)

ros建议使用第一种,通过组件的形式添加依赖库

4. 启用python模块依赖

catkin_python_setup()

很少用到

5. Message/Service/Action 生成文件

add_message_files()
add_service_files()
add_action_files()

6. 启动 message/services/action生成器

generate_messages()

示例:

 find_package(catkin REQUIRED COMPONENTS ...)
 add_message_files(...)
 add_service_files(...)
 add_action_files(...)
 generate_messages(...)
 catkin_package(...)
 ...

7. 指定构建包时的信息输出

catkin_package()

8. 生成库或者可执行文件

add_library() #生成库
add_executable() #生成可执行文件
target_link_libraries()

9. 测试构建

catkin_add_gtest()

10. 安装

install()

二、关于find_package

  1. 使用find_package后,他会构建对应包的cmake环境变量。这些环境变量在后续cmake脚本中会用到。

    这些环境变量包括:头文件路径,源文件路径,依赖库,以及依赖库的路径,命名方法通常如下:

    • _FOUND : bool变量,如果找到该library,设置为true
    • _INCLUDE_DIRS 或者 _INCLUDES : 对应包的头文件路径
    • _LIBRARIES 或者 _LIBS : 对应包的库文件
  2. 使用COMPONENTS 的好处

    在前文中,我们有介绍在出现其他依赖包的时候,如何使用find_package():

    如果有其他依赖包,可以有如下两种写法:
    第一种:
    find_package(catkin REQUIRED COMPONENTS ***)
    第二种:
    find_package(catkin REQUIRED)
    

    第一种写法的好处:

    我们可以将作为COMPONENTS 组件形式添加涛find_package中的所有包的环境变量都依附在catkin包上。这样使得我们后续进行include或者target的时候,只需要写一个catkin_includes 或者 catkin_LIBS就可以,避免了可执行文件或者库文件后面跟一大串的名字,使整个项目架构不清晰。

  3. BOOST

    如果使用boost以及boost中的一些组件的话,我们需要单独指定:

    find_package(Boost REQUIRED COMPONENTS thread XXX)

三、关于catkin_package

catkin_package命令下所有的参数都是面向当前写的这个包的使用者而言。为他使用find_package()命令找到的有关我当前包的所有变量而服务。

catkin提供的cmake宏定义。

必须在 add_library 或者 add_executable()之前调用。

函数有五个可选参数:

  • INCLUDE_DIRS: 输出头文件的目录
  • LIBRARIES: 指定输出lib
  • CATKIN_DEPENDS: 该项目依赖的其他catkin项目
  • DEPENDS: 该项目依赖的其他非catkin项目
  • CFG_EXTRAS: 基本用不到

举个例子:

catkin_package(
   INCLUDE_DIRS include
   LIBRARIES ${PROJECT_NAME}
   CATKIN_DEPENDS roscpp nodelet
   DEPENDS eigen opencv)

上述脚本的含义:

指定当前包文件夹下的include文件夹为输出头文件的地方,后面depends的表示:其他程序使用find_package找到我写的这个程序包的时候, 在include_dir 和library变量中附加上了depands包对应的头文件变量和库文件变量。

建议尽量不要使用这种隐式依赖。

需要注意:catkin_package必须写在生成可执行文件和库文件之前

关于其中DEPENDS部分详细的介绍,可以查询链接:

有人给做了翻译,更好理解一些:

四、关于输出可执行文件和库文件

  1. include paths and library paths

    # 头文件
    include_directories()
    # 库文件
    link_directories()
    
    # 举例:
    include_directories(include ${Boost_INCLUDE_DIRS} ${catkin_INCLUDE_DIRS})
    link_directories(~/my_libs)
    

    不建议使用link_directories来链接库文件,在find_package之后,完全可以直接在对应的target处通过target_link_libraries实现对应链接。

  2. add_library , add_executable, target_link_libraries

    这三部分我们不在详细说了,比较基本的操作。

五、关于add_dependencies

首先说明:

add_dependencies面向的是msg,service或者dynamic reconfigure

他存在的意义是:在我们生成可执行文件或者动态链接库之前,将所使用的msg,service,dynamic reconfigure编译好,供target使用。否则可能会出现找不到对应msg等定义的错误。

所以add_dependencies出现在add_librarytarget_link_librariesadd_executabletarget_link_libraries之间。

所以建议,如果代码中自定义了上述类型,就直接在对应位置添加这句话
add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

  1. 注意事项

    1. 必须在catkin_package() 前出现,可以保证生成msg正常工作。

    2. 在catkin_package()中必须有message_runtime的dependency

      catkin_package(
       ...
       CATKIN_DEPENDS message_runtime ...
       ...)
      
    3. find_package必须加入对应包信息

      find_package(catkin REQUIRED COMPONENTS message_generation)
      
    4. Package.xml中必须包含:

      • build dependency: message_generation
      • Runtime dependency: message_runtime
    5. 如果你的target依赖的其他target需要生成构建msg,那么需要显式使用catkin_EXPORTED_TARGETS,这样才能按照正确构建顺序执行程序。

      add_dependencies(some_target ${catkin_EXPORTED_TARGETS})
      
    6. 如果我的target本身在使用这些message,我需要做如下操作:

      add_dependencies(some_target ${${PROJECT_NAME}_EXPORTED_TARGETS})
      
    7. 如果这个target同时满足第五项,第六项:

      add_dependencies(some_target ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
      
  2. example

      # Get the information about this package's buildtime dependencies
    find_package(catkin REQUIRED
        COMPONENTS message_generation std_msgs sensor_msgs)
    
      # Declare the message files to be built
    add_message_files(FILES
        MyMessage1.msg
        MyMessage2.msg
      )
    
      # Declare the service files to be built
    add_service_files(FILES
        MyService.srv
      )
    
      # Actually generate the language-specific message and service files
    generate_messages(DEPENDENCIES std_msgs sensor_msgs)
    
      # Declare that this catkin package's runtime dependencies
    catkin_package(
       CATKIN_DEPENDS message_runtime std_msgs sensor_msgs
      )
    
      # define executable using MyMessage1 etc.
    add_executable(message_program src/main.cpp)
    add_dependencies(message_program ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
    
      # define executable not using any messages/services provided by this package
      add_executable(does_not_use_local_messages_program src/main.cpp)
      add_dependencies(does_not_use_local_messages_program ${catkin_EXPORTED_TARGETS})
    

六、关于python 模块支持

catkin_python_setup()

注意: 在调用generate_messages() 和 catkin_package() 前使用。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ros下package中CMakelists的编写 的相关文章

  • “sys.path”报告的顺序是搜索包的顺序吗?

    Python 中条目出现的顺序是sys path对应于找到包的顺序 例如我有 gt gt gt from pprint import pprint gt gt gt pprint sys path Library Python 2 7 si
  • Android 应用程序中的多个包

    我在我的应用程序中包含了另一个开发人员免费提供的课程 他的班级有不同的包 这会在 Android 市场等方面造成任何问题吗 应用程序中的每个类都需要是我自己的包吗 尽管这是一个非常古老的问题 但我想澄清一下 Java 级 包 问题所在 和
  • 如何从里程计/tf数据获取投影矩阵?

    我想将视觉里程计的结果与 KITTI 数据集提供的事实进行比较 对于地面中的每一帧 我都有一个投影矩阵 例如 1 000000e 00 9 043683e 12 2 326809e 11 1 110223e 16 9 043683e 12
  • Java中如何在两个包之间共享包私有数据?

    我有 2 个 Java 包 A 和 B 假设包 B 中的某些类想要使用包 A 中的某些类 但是 当开发人员出现并开发包 C 或者说应用程序 C 时 他 她将使用我的包 B 但我do not希望他 她能够使用 B 正在使用的 A 中的类 也就
  • 哪些脚本会进入 Python 包的 bin 文件夹?

    我正在从 Learn Python the Hard Way 及其中提到的练习之一中学习 Python 包 在bin目录下放置一个可以运行的脚本 对我来说 这似乎有点模糊 我不太确定 bin 文件夹中会包含什么样的脚本 搭便车者的包装指南
  • 在我的包的子包中运行 python 脚本

    无法弄清楚正确 python 2 x 首选方式进行相对导入 以便我可以将测试脚本放在一个子包中 并使这些测试脚本能够测试我的库 farm testpad testpad py Traceback most recent call last
  • 如何从 github 手动或离线安装 R 包

    我尝试从 github 下载 tsdyn 包 它尚未在 cran 上更新 但我的代理阻止我连接到 github library devtools install github MatthieuStigler tsDyn ref Dev94
  • 软件包“syncwave”/“mvcwt”不可用(对于 R 版本 3.0.2)[重复]

    这个问题在这里已经有答案了 我想安装软件包mvcwt and SynchWave但收到以下消息 Warning message package mvcwt is not available for R version 3 0 2 Warni
  • Java 包结构中的模块与层

    我曾经把所有东西都放在这样的包中 com company app module1 com company app module2 但它使得基于包的 AOP 切入点变得困难 并导致需要 IDE 才能理解的巨大包 所以现在我意识到我需要一个更深
  • 更新嵌入数据,例如 sysdata.rda

    我最近向 CRAN 提交的内容被退回了 因为我有一份关于全球环境的作业 但现在这已引起人们的不满 我有一个嵌入式数据集 sysdata rda 其中包含基于用户所在州 如美国 的配置参数 我希望当新用户使用该程序时可以更新此嵌入数据集 我之
  • 使用 perl 包时将参数传递给它

    如何在使用包时传递一些参数 例如 use Test More tests gt 21 我无法找到有关此功能的任何有价值的文档 通过这样的论点有什么优点和缺点吗 use My Module LIST https metacpan org po
  • Delphi:如果我在项目中使用包,为什么“使用调试 DCU”会变得无效?

    我正在构建一个使用 JVCL 插件系统的项目 该系统依赖于运行时 Delphi 包 自从我将它添加到我的项目中后 调试就变成了一场噩梦 因为我不再能够单步跟踪源代码任何 VCL 或 RTL 单元 它们在调试器中都被标记为灰点 当相关函数出现
  • 如何将 lib 中的 jar 包含到 Netbeans 中的项目 jar 文件中?

    我正在使用一些 apache HttpClient jar 所以我将它们放在项目的 lib 目录中 当 Netbeans 编译项目时 它会复制 lib 并生成项目 jar 到 dist 目录中 但是当我使用 webstart 运行项目时 我
  • 为什么源码中的根包叫“com”? [复制]

    这个问题在这里已经有答案了 在大多数源代码中 根包 文件夹被命名为 com 为什么会这样 它只是约定俗成还是代表着什么 The 习俗 http download oracle com javase tutorial java package
  • 我应该为 PyDev 下载哪个 Eclipse 包?

    我应该选择哪个 Eclipse 包来进行 Python 开发PyDev http www pydev org Eclipse 主页上没有任何内容告诉我要选择什么 并且 PyDev 文档假设我已经安装了 Eclipse 我选择哪个 Eclip
  • 从需求文件中安装 pip 失败,但可以一一安装

    我正在尝试使用 requests txt 文件通过以下命令安装一堆 python 依赖项 pip install r requirements txt requirements txt 文件包含以下包 pep8 selenium param
  • 如何使用一个凉亭同时创建两个地图?

    如下图所示 现在我的gazebo正在运行2个slam gmapping包 首先是 turtlebot slam gmapping 发布到 map 主题 第二个是 slam gmapping 发布到与第一个相同的 map 主题 我想创建一个新
  • Python包不安装子模块

    我在 dev 分支中创建了一个具有以下结构的包 在验证包安装正确之前不会合并到 main mypackage init py setup py requirements txt module py subpackage one init p
  • 熊猫记忆

    我有冗长的计算 我重复了很多次 因此 我想使用记忆 诸如jug http packages python org Jug and joblib http packages python org joblib memory html 与Pan
  • 闪亮的应用程序包:css 和所有 www/ 目录内容

    我正在尝试将 Shiny 应用程序转换为 R 包 但我在处理有关 www 目录以及 松散 文件的所有问题时遇到了问题 我闪亮的应用程序运行得很好 但是当我尝试 打包它 时 它不起作用 我闪亮的应用程序目录 my shiny app R ut

随机推荐

  • 编程参考 - 编程中给变量起名时如何选择前缀,以及匈牙利命名法等

    我最开始当程序员用C语言写代码 xff0c 公司里推行编码规范 xff0c 变量的前缀都是有规定的 比如整型变量 xff0c 前面都是 u8Name i8Name u16Name i16Name之类的 尤其是嵌入式编程 xff0c 涉及到代
  • 【数据结构与算法 9】谁发明的八皇后,本宫赐你一丈红

    一 八皇后问题 八皇后问题 xff0c 一个古老而著名的问题 xff0c 是回溯算法的经典案例 该问题由国际西洋棋棋手马克斯 贝瑟尔于1848年提出 xff1a 在8 8格的国际象棋上摆放八个皇后 xff0c 使其不能互相攻击 xff0c
  • Linux常用命令

    nbsp nbsp 作者简介 哪吒 CSDN2022博客之星Top1 CSDN2021博客之星Top2 多届新星计划导师 博客专家 专注Java硬核干货分享 立志做到Java赛道全网Top N 本文收录于 Java基础教程系列 目前已经70
  • 读《Java编程思想第五版》心得体会

    x1f345 Java学习路线 xff1a 搬砖工逆袭Java架构师 x1f345 简介 xff1a Java领域优质创作者 x1f3c6 CSDN哪吒公众号作者 Java架构师奋斗者 x1f4aa x1f345 扫描主页左侧二维码 xff
  • 那些优秀的程序员都在看哪些书?

    目录 一 Java 27岁生日啦1995年5月23日2004年2015年2019年2022年 二 Java核心技术 卷1 基础知识 原书第11版 xff09 Core Java 三 Java核心技术 卷2 高级特性 原书第11版 xff09
  • c++ 判断文件是否存在的几种方法

    一般方法 一般而言 xff0c 下述方法都可以检查文件是否存在 xff1a 使用ifstream打开文件流 xff0c 成功则存在 xff0c 失败则不存在以fopen读方式打开文件 xff0c 成功则存在 xff0c 否则不存在使用acc
  • Linux下c/c++头文件和库文件的查找路径

    简介 这是个相当基础的话题 xff0c 平时也觉得知道一点 如头文件会先在当前目录查找 xff0c 如果未找到会查找系统目录 但当问题出现时 xff0c 还是有点不知所措 xff0c 对所谓的 系统目录 一知半解 xff0c 很难把它们的清
  • Tars框架在windows10下安装

    依赖环境 windows版本 xff1a win7以上cmake xff1a 3 2以上mysql 4 1 17以上nvm xff1a 0 35 1以上node 12 13 0以上 分别安装vs2019 xff0c nodejs git m
  • ROS基础(一):ROS通讯之话题(topic)通讯

    目录 第一章 xff1a ROS通讯之话题 topic 通讯一 topic通讯之基础篇1 Node Master大管家2 Node节点3 message 与topic4 小结5 实例 二 topic通讯之进阶篇1 创建learn topic
  • 解决已安装numpy仍然报错ModuleNotFoundError: No module named ‘numpy‘

    简介 目前 xff0c 大多数Linux系统自带python2了 但是很多应用却需要python3 于是安装了python3 每次执行的时候 xff0c 输入python时默认启动python2 xff0c 输入python3才会启动pyt
  • opencv ImportError: libGL.so.1: cannot open shared object file: No such file or directory

    ModuleNotFoundError No module named cv2 使用opencv测试时 xff0c 发现没有安装 xff0c 报错如下 xff1a 安装一下吧 xff1a pip install opencv python
  • CMake中执行shell命令之execute_process、add_custom_target和add_custom_command

    背景 以下情况可能需要在CMake中执行shell脚本 xff1a cmake未提供的功能而实际构建中又需要时 xff0c 如获取Linux发行版本项目构建时需要执行脚本才能完成 xff0c 如boost构建过程 有的需要shell脚本的返
  • rsync增量同步文件用法实践

    rsync rsync remote sync xff0c 远程同步 xff0c 用于在本地机器及远程机器之间同步数据 对于本地机器之内 xff0c 同步数据使用cp即可 对于本地与远程 xff0c 使用scp即可 但上面两个命令同步数据时
  • 关于职业生涯发展的一点思考

    职业类型 从学校毕业步入社会 xff0c 即正式开始了人生职业生涯发展的第一步 总括地说 xff0c 大概有以下几类职业 xff1a 当公务员 xff0c 从政创立公司 xff0c 当企业家找一份工作 xff0c 成为职员 这三条道路 xf
  • c++矩阵计算性能对比:Eigen和GPU

    生成随机矩阵 生成随机矩阵有多种方式 xff0c 直接了当的方式是使用显式循环的方式为矩阵的每个元素赋随机值 span class token macro property span class token directive hash s
  • c语言中 char* 和 unsigned char* 的区别浅析

    背景 最近在项目中遇到了一个编译警告 xff0c 是因为定义的变量为char xff0c 而在使用时作为函数的unsigned char 类型的参数调用 这个警告很容易避免 xff0c 但是char 和unsigned char 到底有什么
  • c语言中static关键字用法详解

    概述 static关键字在c语言中比较常用 xff0c 使用恰当能够大大提高程序的模块化特性 xff0c 有利于扩展和维护 但是对于c语言初学者 xff0c static由于使用灵活 xff0c 并不容易掌握 本文就static在c语言中的
  • linux下把进程/线程绑定到特定cpu核上运行

    概述 现在大家使用的基本上都是多核cpu xff0c 一般是4核的 平时应用程序在运行时都是由操作系统管理的 操作系统对应用进程进行调度 xff0c 使其在不同的核上轮番运行 对于普通的应用 xff0c 操作系统的默认调度机制是没有问题的
  • git中submodule子模块的添加、使用和删除

    背景 项目中经常使用别人维护的模块 xff0c 在git中使用子模块的功能能够大大提高开发效率 使用子模块后 xff0c 不必负责子模块的维护 xff0c 只需要在必要的时候同步更新子模块即可 本文主要讲解子模块相关的基础命令 xff0c
  • ros下package中CMakelists的编写

    目录 一 package自动生成的Cmakelists1 指定cmake版本2 项目名字3 寻找构建所需依赖包4 启用python模块依赖5 Message Service Action 生成文件6 启动 message services