ROS学习之CMakelists.txt和package.xml

Posted NodYoung

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ROS学习之CMakelists.txt和package.xml相关的知识,希望对你有一定的参考价值。

package.xml

当你的package里已经包含配置文件(package.xml),ROS能够找到它。执行:rospack find [包名称]。应该注意到我们刚才所创建的package.xml依赖于 roscpp 和 std_msgs.而catkin恰恰是利用这些依赖项来配置所创建的package。

基本结构

使用<package>标签作为根标记文件。

<package>

</ package>

所需标签

  • <name> - 包的名称

  • <version> - 包的版本号(需要3个点分隔的整数)

  • <description> - 包装内容的描述

  • <maintainer> - 维护包的人员的名称

  • <license> - 发布代码的软件许可证(例如GPL,BSD,ASL)。

依赖关系

格式1

  • <buildtool_depend>构建工具依赖关系指定此软件包需要构建自身的构建系统工具。通常唯一的构建工具是catkin。在交叉编译场景中,构建工具依赖关系用于执行编译的架构。
  • <build_depend>构建依赖关系指定构建此包所需的包。在构建时需要这些软件包中的任何文件时才是这种情况。这可以包括这些包在编译时的标头,链接到这些包的库或在构建时需要任何其他资源(特别是当这些包在CMake 中是find_package())时)。在交叉编译场景中,构建依赖关系针对目标体系结构。
  • <run_depend>运行依赖关系指定在此程序包中运行代码所需的软件包,或针对此软件包构建库。在这种情况下,您依赖于共享库或将其头部包含在此包中的公头中(特别是当这些包在CMake 中的catkin_package()中声明为(CATKIN_DEPENDS)时)。

CMakelists.txt

我们还需要一个 CMakeLists.txt 文件,这样 catkin_make才能够利用 CMake 强大的跨平台特性来编译所创建的package。

CMake版本

  • cmake_minimum_required(VERSION 2.8.3)

软件包名称

  • project(beginner_tutorials)它对应package.xml的<name>标签。在CMake中,您可以随时在CMake脚本中随时使用变量$ PROJECT_NAME 来引用项目名称。

查找构建所需的其他CMake / Catkin 程序包

find_package()这个函数,或者叫宏。是cmake原有,它是用来寻找库文件。它其实是对应了package.xml标签中的xxx特别在生成消息/服务时,运行和编译时的依赖不一样,所以说findpackage()与catkin_package(CATKIN_DEPEND xxx)所跟的依赖是略有不同的,findpackage要的是message_generation,catkin_package要的是message_runtime。
如果CMake通过find_package找到一个包,则会创建几个提供有关找到包信息的CMake环境变量。这些环境变量可以稍后在CMake脚本中使用。环境变量描述了包导出的头文件的位置,源文件的位置,包所依赖的库以及这些库的路径。名称符合<PACKAGE NAME> _ <PROPERTY>的惯例:
- <NAME> _FOUND - 如果找到库,则设置为true,否则为false
- <NAME> _INCLUDE_DIRS或<NAME> _INCLUDES - 包导出的包含路径
- <NAME> _LIBRARIES或<NAME> _LIBS - 由包导出的库
- <NAME> _DEFINITIONS -

catkin程序包

  • find_package(catkin REQUIRED COMPONENTS xyz)REQUIRED表示要寻找的依赖包对我来说很重要,如果找不到就不编译了。COMPONENTS它表示我们要找的包需要后面的这些库或者包。

CMake程序包

  • find_package(Boost REQUIRED COMPONENTS thread)如果使用C ++和Boost,您需要在Boost上调用find_package()。

启用Python模块支持

  • catkin_python_setup()

消息/服务/动作生成

消息(.msg),服务(.srv)和动作(.action)文件在ROS包构建和使用之前需要一个特殊的预处理器构建步骤。这些宏的要点是生成编程语言特定的文件,以便可以利用其选择的编程语言中的消息,服务和动作。
- add_message_files
- add_service_files
- add_action_files
这些宏之后必须跟随调用生成的宏generate_messages()

Catkin包的导出、依赖信息

catkin_package()是一个catkin提供的CMake宏。这是为构建系统指定catkin特定信息所必需的,以便进一步应用于生成pkg-config和CMake文件。在使用add_library()add_executable()声明任何目标之前,必须调用此函数。该函数有5个可选参数:
INCLUDE_DIRS - 包的导出包含路径。表示这个catkin包的头文件是导出到include这个文件夹,include位置是位于该功能包目录下(需要手动创建)就是当前编写的CMakeList.txt所在位置,与msg、srv、package.xml、CMakeList.txt共存的位置。与工作空间下(有src、build、devel的位置)devel文件下的include不同,那个有包含由msg文件生成的消息、服务的头文件。
LIBRARIES - 从项目导出的库,就是做成一个库给别的功能包用。
CATKIN_DEPENDS - 该项目依赖的其他catkin项目。是简单来说要填的内容就是该功能包运行时所需要的、所依赖的catkin包。它与package.xml中标签xxxx对应。运行和编译时的依赖不一样,所以说findpackage()与catkin_package(CATKIN_DEPEND xxx)所跟的依赖是略有不同的,findpackage要的是message_generation,catkin_package要的是message_runtime。
DEPENDS - 该项目所依赖的非catkin CMake工程。这个包运行时所依赖的包如果不属于catkin包的话就要写在这里。简单来说,一样也是通过package.xml的run_depend标签所决定所确定。
`CFG_EXTRAS - 其他配置选项

建立库/可执行文件

  • include_directories(<dir1>,<dir2>,...,<dirN>) 是用来指定头文件的搜索路径。include_directories的参数应该是find_package调用生成的*_INCLUDE_DIRS变量。如果用findpackage()寻找catkin和Boost,然后用include_directories()找它俩的头文件,可以这样表达:include_directories(include $Boost_INCLUDE_DIRS $catkin_INCLUDE_DIRS)

  • add_library()将功能包的cpp生成一个库给别人用。默认的catkin编译产生共享库add_library($ PROJECT_NAME $ $ PROJECT_NAME _SRCS)

  • add_executable() 将该功能包的cpp生成可执行文件。

  • add_dependencies(some_target $PROJECT_NAME_generate_messages_cpp)如果你有一个包编译.msg .srv,并且可执行文件要使用他们,那么你就需要创建一个显式的依赖项,自动生成message的target。这里的some_target是add_executable()设置的target的名字。

  • target_link_libraries(<executableTargetName>,<lib1>,<lib2>,... <libN>)函数来指定可执行文件链接的库。

测试建立

安装规则

参考:
catkinCMakeLists.txt
catkinpackage.xml
ROS之CMakeLists
ROS学习之CMakeLists.txt完全解析
ROS中的CMakeLists.txt

以上是关于ROS学习之CMakelists.txt和package.xml的主要内容,如果未能解决你的问题,请参考以下文章

ROS学习之CMakelists.txt和package.xml

ROS中的CMakeLists.txt

没有使用ROS顶层CMakelists.txt,如何给所有子项目的cmake默认值?

ros项目 CMakeLists.txt中添加自己的库路径

licode学习之编译篇--3

ROS学习之消息包