ROS的CmakeList写法

catkin是当前ROS的官方编译工具。
catkin编译基于CMake,源代码以package为单位组织,每个package必须包含package.xml和CMakeList.txt两个文件。

(1)package.xml
catkin支持两种package.xml标签格式,格式1标准说明是REP-0127,格式2标准说明是REP-0140。后者是针对前者的一些缺点进行改进后的版本,因此更加被推荐使用。
在package.xml中主要包含以下信息:

描述信息(比如package的功能描述、维护者等)
依赖信息
元信息(比如作者、网页)
package信息(比如版本)
每个package.xml文件必须包含的标签包括:

<package>  : 最高级tag,属性:format,用于指定格式
<name> :package名称
<version> :当前版本
<description>:package的基本描述
<maintainer>(至少一个):维护者
<license>(至少一个):协议
<buildtool_depend>(至少一个):一般情况下只需要指定catkin作为编译工具,在需要交叉编译的情况下需要增加目标机器的编译工具。
可选标签包括:

<package>
<url> (多个):指定package的网址
<author> (多个):作者
<build_depend> (多个):编译时需要依赖的其它package,适用于静态库
<conflict> (多个):声明本package与其它ROS package有冲突,不能同时部署
<replace> (多个):声明本package是其它package的替换版本
<export>:用于添加额外的信息,比如需要嵌入的其它package的插件,或者一些说明信息。

(2)CMakeList.txt
1.cmake_minimum_required():CMake版本
2.project():工程名
3.add_compile_options():编译器选择
比如:

cmake_minimum_required(VERSION 3.0.2)
project(ui_console)
add_compile_options(-std=c++11)

4.find_package():加载外部变量

version和EXACT: 都是可选的,version指定的是版本,如果指定就必须检查找到的包的版本是否和version兼容。如果指定EXACT则表示必须完全匹配的版本而不是兼容版本就可以。
QUIET 可选字段,表示如果查找失败,不会在屏幕进行输出(但是如果指定了REQUIRED字段,则QUIET无效,仍然会输出查找失败提示语)。
MODULE可选字段。前面提到说“如果Module模式查找失败则回退到Config模式进行查找”,但是假如设定了MODULE选项,那么就只在Module模式查找,如果Module模式下查找失败并不回落到Config模式查找。
CONFIG可选字段。直接在Config模式中查找。下文会介绍什么是Moudule模式什么是Config模式。
REQUIRED可选字段。表示一定要找到包,找不到的话就立即停掉整个cmake。而如果不指定REQUIRED则cmake会继续执行。
COMPONENTS:可选字段,表示查找的包中必须要找到的组件(components),如果有任何一个找不到就算失败,类似于REQUIRED,导致cmake停止执行。如find_package( PCL REQUIRED COMPONENT common io )我们就利用了该关键字寻找了common和io包。
OPTIONAL_COMPONENTS:可选的模块,找不到也不会让cmake停止执行。

5.include_directories():添加头文件路径
添加包的头文件路径,如果有其它外部路径也在这里添加。比如

include_directories(
include 
${catkin_INCLUDE_DIRS}
${Boost_INCLUDE_DIRS}
)

6.add_library():生成库

# 生成库文件,可传入多个源文件
add_library(your_library 
    libsrc1.cpp 
    libsrc2.cpp 
    libsrc_etc.cpp
)

7.add_executable():生成可执行文件

# 生成可执行文件,可以传入多个源文件
add_executable(my_node 
    src0.cpp 
    src1.cpp 
    src2.cpp
)

8.add_dependencies():添加依赖项,在使用ROS的message、service、action时注意添加,如下:

# 添加对其它package消息的依赖,前提是已经通过find_package()引入了这个package
add_dependencies(my_target ${catkin_EXPORTED_TARGETS})
# 添加对本package消息的依赖
add_dependencies(my_target ${${PROJECT_NAME}_EXPORTED_TARGETS})

9.target_link_libraries():链接库

# 为可执行文件或库添加链接库
target_link_libraries(my_node
    ${catkin_LIBRARIES}        # ROS基本库
    ${Boost_LIBRARIES}         # Boost库
)

10.install():安装

# 默认情况catkin会为每个package在./devel中建立目录,存放目标文件
# 目标文件可以直接通过rosrun和roslaunch访问
# 如需制定其它安装位置,则需通过install()命令
install(TARGETS my_node0 my_node1
  ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
  RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
)

11.add_message_files(), add_service_files(), add_action_files()
用于添加自定义的message、service和action文件。基本语法为:

# 以message为例,service、action类似
add_message_files(
    # 目录名
    DIRECTORY msg
    # 文件名
    FILES YourFirstMessage.msg YourSecondMessage.msg YourThirdMessage.msg
)

11.catkin_package()

catkin_package()是catkin提供的CMake宏,用于为catkin提供构建、生成pkg-config和CMake文件所需要的信息。
必须在声明add_library()或add_executable()前调用
有5个可选参数:

INCLUDE_DIRS - 声明给其它package的include路径
LIBRARIES - 声明给其它package的库
CATKIN_DEPENDS - 本包依赖的catkin package
DEPENDS - 本包依赖的非catkin package
CFG_EXTRAS - 其它配置参数
比如:

catkin_package(
   INCLUDE_DIRS include
   LIBRARIES ${PROJECT_NAME}
   CATKIN_DEPENDS roscpp nodelet
   DEPENDS eigen opencv
   )
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

夏融化了这季节

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值