ROS中CMakeLists.txt文件 使用 讲解与总结

本文涉及的产品
资源编排,不限时长
简介: ROS中CMakeLists.txt文件 使用 讲解与总结

CMakeLists.txt作用

在ROS系统的功能包中 要包含 CMakeLists.txt 与 package.xml 文件 来 编译功能包的内容

CMakeLists.txt原本是Cmake编译系统的规则文件,而Catkin编译系统基本沿用了CMake的 编译风格,只是针对ROS工程添加了一些宏定义。所以在写法上,catkin 的 CMakeLists.txt与CMake的基本一致。

这个文件直接规定了这个package要依赖哪些package,要编译生成哪些目标,如何编译等等 流程。

所以 CMakeLists.txt 非常重要,它指定了由源码到目标文件的规则,catkin编译系统在 工作时首先会找到每个package下的 CMakeLists.txt ,然后按照规则来编译构建。

CMakeLists.txt写法

CMakeLists.txt 的基本语法都还是按照CMake,而Catkin在其中加入了少量的宏

总体的结构如下:

cmake_minimum_required()    #CMake的版本号

project()                    #项目名称

find_package()                #找到编译需要的其他CMake/Catkin    package 

catkin_python_setup()        #catkin新加宏,打开catkin的Python Module的支持

add_message_files()            #catkin新加宏,添加自定义Message文件 

add_service_files()         #catkin新加宏,添加自定义Service文件 

add_action_files()          #catkin新加宏,添加自定义Action文件 

generate_message()            #catkin新加宏,生成不同语言版本的msg/srv/action接口 

catkin_package()            #catkin新加宏,生成当前package的cmake配置,供依赖本包的其他软件包调用 

add_library()                #生成库 

add_executable()            #生成可执行二进制文件

add_dependencies()            #定义目标文件依赖于其他目标文件,确保其他目标已被构建 

target_link_libraries()        #链接

catkin_add_gtest()            #catkin新加宏,生成测试

install()                    #安装至本机

CMakeLists实例

为了详细的解释 CMakeLists.txt 的写法,
以turtlesim小海龟这个pacakge为例,

可 roscd 到 tuetlesim 包下查看,

在 turtlesim/CMakeLists.txt 的写法如下,:

代码进行逐行注释

cmake_minimum_required(VERSION    2.8.3)
 # CMake至少为2.8.3版

project(turtlesim)
  # 项目(package)名称为turtlesim,在后续文件中可使用变量${PROJECT_NAME}来引用项目名称turltesim

//这两个是 通过ros 指令 创建包  中就自动生成好的


find_package(catkin    REQUIRED    COMPONENTS    
   geometry_msgs    
   message_generation    
   rosconsole    
   roscpp    
   roscpp_serialization    
   roslib    
   rostime    
   std_msgs    
   std_srvs) 
#cmake宏,指定依赖的其他pacakge,实际是生成了一些环境变量,如<NAME>_FOUND,    <NAME>_INCLUDE_DIRS ,    <NAME>_LIBRARYIS #此处catkin是必备依赖    其余的geometry_msgs...为组件


include_directories(include    ${catkin_INCLUDE_DIRS}    ${Boost_INCLUDE_DIRS}) 
#指定C++的头文件路径


link_directories(${catkin_LIBRARY_DIRS}) 
#指定链接库的路径



add_message_files(DIRECTORY    msg    FILES Color.msg    Pose.msg) #自定义msg文件


add_service_files(DIRECTORY    srv    FILES Kill.srv SetPen.srv Spawn.srv TeleportAbsolute.srv TeleportRelative.srv) #自定义srv文件


generate_messages(DEPENDENCIES    geometry_msgs    std_msgs    std_srvs)
#在add_message_files、add_service_files宏之后必须加上这句话,用于生成srv msg头文件,生 成的文件位于devel/include中



catkin_package(CATKIN_DEPENDS    geometry_msgs    message_runtime    std_msgs    std_srvs) 
#    catkin宏命令,用于配置ROS的package配置文件和CMake文件 
#    这个命令必须在add_library()或者add_executable()之前调用,该函数有5个可选参数: 
#    (1)    INCLUDE_DIRS    -    导出包的include路径 
#    (2)    LIBRARIES    -    导出项目中的库 
#    (3)    CATKIN_DEPENDS    -    该项目依赖的其他catkin项目 
#    (4)    DEPENDS    -    该项目所依赖的非catkin    CMake项目。 
#    (5)    CFG_EXTRAS    -    其他配置选




set(turtlesim_node_SRCS src/turtlesim.cpp src/turtle.cpp src/turtle_frame.cpp) 
set(turtlesim_node_HDRS include/turtlesim/turtle_frame.h ) 
#指定turtlesim_node_SRCS、turtlesim_node_HDRS变量

qt5_wrap_cpp(turtlesim_node_MOCS    ${turtlesim_node_HDRS})


add_executable(turtlesim_node    ${turtlesim_node_SRCS}    ${turtlesim_node_MOCS}) #    指定可执行文件目标turtlesim_node 

target_link_libraries(turtlesim_node    Qt5::Widgets    ${catkin_LIBRARIES}    ${Boost_LIBRARIE S}) #    指定链接可执行文件

add_dependencies(turtlesim_node    turtlesim_gencpp)
add_executable(turtle_teleop_key    tutorials/teleop_turtle_key.cpp) target_link_libraries(turtle_teleop_key    ${catkin_LIBRARIES}) add_dependencies(turtle_teleop_key    turtlesim_gencpp)
add_executable(draw_square    tutorials/draw_square.cpp) target_link_libraries(draw_square    ${catkin_LIBRARIES}    ${Boost_LIBRARIES}) add_dependencies(draw_square    turtlesim_gencpp)
add_executable(mimic    tutorials/mimic.cpp) target_link_libraries(mimic    ${catkin_LIBRARIES}) add_dependencies(mimic    turtlesim_gencpp) 
#    同样指定可执行目标、链接、依赖


install(TARGETS    turtlesim_node    turtle_teleop_key    draw_square    mimic RUNTIME    DESTINATION    ${CATKIN_PACKAGE_BIN_DESTINATION}) #    安装目标文件到本地系统



install(DIRECTORY    images DESTINATION    ${CATKIN_PACKAGE_SHARE_DESTINATION} FILES_MATCHING    PATTERN    "*.png"    PATTERN    "*.svg")

目前先写到这 以后相关内容再补充

工程实践中 遇到问题总结

在一个功能包中
将类的函数定义 与 声明 分开 文件写 用main.cpp 调用

类的声明和定义分开文件下, 按 之前那么处理 分布查看

只加这个 先 生成 library
在这里插入图片描述
编译成功 类的声明 和函数定义分开写的
在这里插入图片描述
生成了这个文件

继续加main.cpp的
只加这个
在这里插入图片描述
报错 很多都没定义
在这里插入图片描述
加上这个
在这里插入图片描述
这一条最后去掉了编译也成功 ,在使用自己的msg头文件时,必须添加add_dependencies,否则找不到自定义的msg产生的头文件

报错一样
再加
在这里插入图片描述
报错变了 没有了ros::init()这种未定义了 说明 必须要 加上面的 是最基本的
在这里插入图片描述
现在的错误就是没有找到类的定义的函数

把这个库加上
在这里插入图片描述
还是没找到 和之前报错一样

给上面那个 类的 定义 那个库 也加上 target_link_libraries
在这里插入图片描述
编译就通过了
target_link_libraries ()这个 功能可能是 让其它 文件可以定用这个库

  • [ ] 那么还有个问题 ,要想用其它功能包的 类的 函数 怎么办?

官网有详细的解释
CMakeLists.txt ROS 官网

相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
阿里云资源编排ROS使用教程
资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有资源的创建和配置,以达到自动化部署、运维等目的。编排模板同时也是一种标准化的资源和应用交付方式,并且可以随时编辑修改,使基础设施即代码(Infrastructure as Code)成为可能。 产品详情:https://www.aliyun.com/product/ros/
相关文章
|
7月前
|
Shell
百度搜索:蓝易云【Ros终端出现找不到bash: /home/***/devel/setup.bash: 没有那个文件或目录怎么办?】
通过以上步骤,您应该能够解决 "找不到bash: /home/ *** /devel/setup.bash: 没有那个文件或目录" 错误,并正常使用ROS环境。如果问题仍然持续存在,建议您检查您的ROS安装和配置,并参考ROS官方文档或ROS社区寻求帮助。
308 0
|
4月前
|
XML 存储 机器人
06 ROS配置launch文件
本文介绍了如何在ROS(机器人操作系统)中配置launch文件,包括设置节点、参数、局部变量、重映射以及嵌套launch文件的方法,并通过XML格式实现了多节点的一键配置与启动。
64 0
|
4月前
|
XML 存储 网络安全
ROS入门(二):launch文件解析
该文章是关于ROS入门的第二篇教程,详细解析了ROS中的launch文件,包括其运行方式、XML格式规范、标签使用、参数替代、条件属性以及通过简单和复杂案例来演示launch文件的使用,最后介绍了如何在参数服务器上设置参数。
ROS入门(二):launch文件解析
linux如何让ros文件在任何终端中运行:三行代码搞定
linux如何让ros文件在任何终端中运行:三行代码搞定
|
定位技术
ROS学习-从bag文件中读取messages
ROS学习-从bag文件中读取messages
803 0
|
Ubuntu 开发工具
ROS学习-使用rosed来编辑ROS中的文件
ROS学习-使用rosed来编辑ROS中的文件
209 0
|
Ubuntu
ROS学习-了解ROS的文件结构
ROS学习-了解ROS的文件结构
148 0
在ROS 中 功能包 中将类的函数定义 与 声明 分开 文件写 用main.cpp 调用 如何配置 CmakeList.txt
在ROS 中 功能包 中将类的函数定义 与 声明 分开 文件写 用main.cpp 调用 如何配置 CmakeList.txt
在ROS 中 功能包 中将类的函数定义  与 声明 分开 文件写  用main.cpp 调用  如何配置  CmakeList.txt

推荐镜像

更多