ROS下CMakeLists.txt文件解析

1、catkin简介

从gcc到make再到cmake以及catkin解析参考make和cmake简要介绍_make cmake-CSDN博客catkin是ROS官方自定义的编译系统,它的原理与流程与Cmake很相似,和老版本rosbuild相比,支持更好的可移植性(catkin结合了可移植性好的CMake和python)以及交叉编译。(在ROS2使用的编译工具是ament,它是由catkin优化迭代而来的版本)。知乎 - 安全中心icon-default.png?t=N7T8https://link.zhihu.com/?target=https%3A//www.cnblogs.com/dinghongkai/p/11316528.htmlcmake编译程序的流程:cmake指令依据你的CMakeLists.txt 文件,生成makefiles文件,make再依据此makefiles文件编译链接生成可执行文件。catkin_make是将cmake与make的编译方式做了一个封装的指令工具, 规范了工作路径与生成文件路径。

cmake标准流程:

$ cd /源文件目录 #(CmakeLists.txt文件所在目录)

$ mkdir build

$ cd build

$ cmake ..

$ make

$ make install #(可选)

 catkin_make标准流程构建 ROS (Robot Operating System) 工作空间的命令行工具catkin_make用法汇总_ros工作空间catkin make以后有修改-CSDN博客

# In a catkin workspace
$ catkin_make
$ catkin_make install  # (可选)

如果源码不在默认工作空间,需要指定编译路径:
# In a catkin workspace
$ catkin_make --source my_src
$ catkin_make install --source my_src  # (可选)

CmakeList.txt文件解析

## 1 -- 项目所需要的CMake版本,向后兼容:
        cmake_minimum_required(VERSION 3.0.2)

## 2 -- 使用CMake project(package-name)声明软件包名称,可以通过使用变量 ${PROJECT_NAME} 在CMake脚本后面的任何位置引用项目名称。
        project(beginner_tutorials)

## 3 --  CMake宏,查找编译所需的其他 CMake/Catkin 包:
# [REQUIRED]:当没有满足条件的package时(例如指定的组件未找到等),
# 会终止CMake执行过程,并输出一条错误信息,反之,CMake会继续执行。
# [COMPONENTS]:要查找的组件(components),通常一个pakcage可能包含多个组件。
# roscpp、rospy...就是catkin的组件。

# 任何一个找不到就算失败,会终止CMake执行过程。  
# 确保所有这些依赖package也在package.xml中,使用<depend>或<build_denpend>标记。

格式:

find_package(<package-name> REQUIRED COMPONENTS component1 commponent2 …)

例子:

        ##查找catkin库组件roscpp、rospy、std_msgs(find_package()一次只能查找一个package,catkin是指ROS工程中使用catkin工具编译的packages,而且凡是有catkin编译的包都可以作为catkin的组件,也可以作为单独的package)
        find_package(catkin REQUIRED COMPONENTS
          roscpp
          rospy
          std_msgs
        )

        ## 查找 PythonLibs 库
        find_package(PythonLibs REQUIRED)

        ## 查找C++ Boost库的组件system、thread
        find_package(Boost REQUIRED COMPONENTS system thread)

## 4 -- 启用 Python 模块支持:(catkin新加的宏)
## 如果这个package有setup.py,则取消对此的注释。
## 这个宏确保其中声明的模块和全局脚本得到安装
        catkin_python_setup()

################################################
## Declare ROS messages, services and actions ##
## 声明 ROS 消息、服务和动作                      ##  
################################################

## 5 --  添加在`msg`文件夹中自定义的`*.msg`文件(catkin新加的宏)
## 将Message*.msg替换成你的.msg文件,
        add_message_files(
        FILES
        Message1.msg
        Message2.msg
        )

## 5 --  添加在`srv`文件夹中自定义的`*.srv`文件(catkin新加的宏)
## 将Service*.msg替换成你的.srv文件
        add_service_files(
        FILES
        Service1.srv
        Service2.srv
        )

## 5 --  添加在`action`文件夹中自定义的`*.action`文件(catkin新加的宏)
## 将Action*.action替换成你的.action文件
        add_action_files(
        FILES
        Action1.action
        Action2.action
        )

## 6 --  调用`消息`/`服务`/`动作`生成特定语言的接口文件(catkin新加的宏)
## 用于生成所有定义的message、service、action文件,需要添加本文件需要依赖的packages。
## 其实就是告诉编译器,编译 *.msg *.srv *.action 等文件时,需要依赖的库或package。
## Generate added messages and services with any dependencies listed here
        generate_messages(
        DEPENDENCIES
        std_msgs  # Or other packages containing msgs
         )

################################################
##   7--Declare ROS dynamic reconfigure parameters ##

 实现在程序运行过程中实时更改参数大小,C++代码通过回调函数接收数据
################################################
## To declare and build dynamic reconfigure parameters within this
## package, follow these steps:
## * In the file package.xml:
##   * add a build_depend and a exec_depend tag for "dynamic_reconfigure"

##     <build_depend>dynamic_reconfigure</build_depend>
## * In this file (CMakeLists.txt):
##   * add "dynamic_reconfigure" to
##     find_package(catkin REQUIRED COMPONENTS  dynamic_reconfigure)
##   * uncomment the "generate_dynamic_reconfigure_options" section below
##     and list every .cfg file to be processed

## Generate dynamic reconfigure parameters in the 'cfg' folder
# generate_dynamic_reconfigure_options(
#   cfg/DynReconf1.cfg
#   cfg/DynReconf2.cfg
# )

###################################
## catkin specific configuration ##
###################################
## 8 -- catkin_package() (catkin新加的宏)
## 由catkin_package生成的文件最终会被安装到devel和build文件夹下;
## INCLUDE_DIRS: 如果package包含头文件,则取消对此行的注释,声明给其它package的本功能包的include路径:意思就是如果其他功能包使用本功能包的话,当中会包含我们在本功能包声明的include路径和库,对于DEPENDS依赖项,会将DEPENDS的头文件路径和库添加到本功能包下的include路径和库。
## LIBRARIES: 本项目导出的库,声明给其它package的库;
## CATKIN_DEPENDS: 本项目依赖的其余catkin项目;
## DEPENDS: 本项目依赖的其余非catkin项目;
        catkin_package(
        INCLUDE_DIRS include
        LIBRARIES beginner_tutorials
        CATKIN_DEPENDS roscpp rospy std_msg
        DEPENDS system_lib
        )


## 9 -- include_directories()指定头文件的搜索路径(catkin新加的宏)
           include_directories(     

                # include
               ${catkin_INCLUDE_DIRS}
                )

## 第一个参数“include”表示包中的include/目录也是路径的一部分。
## catkin_INCLUDE_DIRS:表示建立的环境变量

## 10 -- add_library() 生成库文件${PROJECT_NAME}将功能包做成一个库给别人用)

是用来将目标文件生成一个库文件(造一个库给别人用)。默认情况下,生成共享库(即所谓的动态库,我们平常见到的share文件夹装的就是这些动态库,后缀名是xxx.so的库文件)注意:静态库生成的是xxx.a文件,一般放在lib文件夹。

         add_library(${PROJECT_NAME}
          src/${PROJECT_NAME}/beginner_tutorials.cpp
           )

例子:

        add_library(haha src/some_file.cpp)

        该功能包将生成一个名为haha的动态库即 haha.so

        add_library(haha STATICsrc/some_file.cpp)在中间加入STATIC就可以构建静态库

        该功能包将生成一个名为haha的静态库即 haha.a

## 11 -- 生成可执行的二进制文件
## add_executable(<生成> <源文件>)
## 使用${PROJECT_NAME}引用变量,生成一个名为beginner_tutorials的可执行文件。
         add_executable(${PROJECT_NAME}  src/beginner_tutorials_node.cpp)

## 12 -- 定义target依赖的其他target
## add_dependencies(target-name depend-target1 depend-target2 ...)
        add_dependencies(${PROJECT_NAME} ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

##  13 -- 指定可执行目标链接的库

使用此指令,将可执行文件需要链接的库文件链接上去。注意点:必须在add_executable后面再使用。(调用别的库给自己用)
         target_link_libraries(${PROJECT_NAME}
          ${catkin_LIBRARIES}
          )

## 安装python可执行脚本
# catkin_install_python(PROGRAMS
#   scripts/my_python_script
#   DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
# )

## 14 -- 安装规则 -- 目标文件的安装

## ARCHIVE:静态库
## LIBRARY:动态库
## RUNTIME:可执行目标二进制
## DESTINATION:定义了安装的路径
## 1、将执行二进制文件beginner_tutorials 安装到 ${CATKIN_PACKAGE_BIN_DESTINATION}目录

2、将静态库beginner_tutorials 安装到 ${CATKIN_PACKAGE_LIB_DESTINATION}目录

3、将动态库beginner_tutorials 安装到 ${CATKIN_PACKAGE_LIB_DESTINATION}目录

         install(TARGETS ${PROJECT_NAME}
         RUNTIME DESTINATION ${CATKIN_PACKAGE_BIN_DESTINATION}
        )

        install(TARGETS ${PROJECT_NAME}
        ARCHIVE DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
        LIBRARY DESTINATION ${CATKIN_PACKAGE_LIB_DESTINATION}
        RUNTIME DESTINATION ${CATKIN_GLOBAL_BIN_DESTINATION}
        )

## 15 -- 安装规则 -- 目录的安装
## 如果目录以“/”结尾,表示将目录中的内容安装到目标路径
## 如果目录不以“/”结尾,表示将目录安装为目标路径下的目录
## PATTERN:用于使用正则表达式进行过滤
        install(DIRECTORY include/${PROJECT_NAME}/
        DESTINATION ${CATKIN_PACKAGE_INCLUDE_DESTINATION}
        FILES_MATCHING PATTERN "*.h"
        PATTERN ".svn" EXCLUDE   
        )

## 16 -- 安装规则 -- 普通文件的安装
        install(FILES
        myfile1
        myfile2
        DESTINATION ${CATKIN_PACKAGE_SHARE_DESTINATION}
        )

  • 11
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值