ROS CMakeLists.txt的编写学习

2023-05-16

调用ROS中的函数,cmakelists的编写学习过程。如有错误,请留言指教。多谢

A.首先要了解的

 

 

 
        CMakeLists.txt是CMake的构建系统构建软件包的输入文件。任何兼容的CMake都包含了描述如何构建代码,并在根目录及子目录进行安装到一个或多个的CMakeLists.txt文件。用于catkin项目的CMakeLists.txt文件是有一些限制标准格式。

B.整体的结构及排序
 

                    自己编写的CMakeLists.txt必须遵循一定的格式,否则库文件无法正确编译的。cmake的一些命令都是按照一定的顺序编写的。

 

 

  1. Required CMake Version (cmake_minimum_required)//cmake版本

  2. Package Name (project()) //项目名称

  3. Find other CMake/Catkin packages needed for build (find_package()) //需要的库文件

  4. Message/Service/Action Generators (add_message_files(), add_service_files(), add_action_files()) //输出的信息,服务,及生成的东西

  5. Invoke message/service/action generation (generate_messages()) //生成信息~~~

  6. Specify package build info export (catkin_package()) //catkin的库文件

  7. Libraries/Executables to build (add_library()/add_executable()/target_link_libraries()) //库文件,生成文件及路径

  8. Tests to build (catkin_add_gtest())

  9. Install rules (install())

C.cmake版本

 

 

       每一个Catkin(catkin是ROS的一个官方的编译构建系统)的cmakelist的编写都是要从版本开始的。catkin对cmake的要求至少是2.8.3以上的

具体的命令比如:

cmake_minimum_required(VERSION 2.8.3)

D。项目名

 

 

       接下来就要写有Cmake函数指定的项目的名称。比如建立一个工程名,叫robot_brain

 

project(robot_brain)

 

 

 

E寻找Cmake依赖库

 

       接下来,我们用CMake find_package函数来发现其他的指定的Cmake指令,来建立我们自己的项目。调用ROS,至少需要catkin的依赖库

 

find_package(catkin REQUIRED)

       如果你的工程里面呢,只用到了一些库,那么就会转变为catkin的一些函数。不用使用find_package函数来找到所有的库文件,只需要像函数一样指定他们就可以了。这样会更简单一些。举个例子,如果你像用nodelet.函数呢

 

 

find_package(catkin REQUIRED COMPONENTS nodelet)

        需要注意的是:如果你只用find_package来找到一些函数来设置一个标志,那么就不能用runtime的依赖项了。而是应该像下面一样:

 

 

find_package(catkin REQUIRED)
find_package(nodelet REQUIRED)

 

 

 

E.a find_package函数讲解

 

       如果通过CMake的find_package函数来找到库文件的话,就找到一些库文件的信息并且会创建一些环境变量,这些环境变量可以在稍后的Cmake脚本里面被利用到。这些环境变量描述了头文件的输出位置,源文件的位置,库文件的依赖项以及库文件的位置。指令大部分是下面这样<PACKAGE NAME>_<PROPERTY>(文件名+属性)

 

E.b 为什么Catkin的库文件要被当做组件?

 

       carkin的库文件并不是组件,而cmake组件的功能则用来catkin的设计,能够显著节省打字时间的。

       对于catkin的库文件呢,如果进行一个简单的环境变量的设置,用find_package函数作为catkin部件调用,相比之下利用catkin_ prefix函数来进行调用还是有优势的。举个例子,假如在源码中你要使用nodelet函数的话,找到这个库文件的方法可以这样写

 

find_package(catkin REQUIRED COMPONENTS nodelet)

       这意味着nodelet的包含路径、库路径以及一些输出等等都附加给了catkin的变量了。举个例子,catkin_INCLUDE_DIRS包含的包含路径,并不仅仅catkin,也包含了nodelet。这个以后会排上很到用场。

 

       我们也可以用find_package来找到nodelet

find_package(nodelet)

 

       这意味着nodelet的路径,库路径等等不会添加到catkin的变量中。

       结果保留在nodelet_INCLUDE_DIRS,nodelet_LIBRARIES等等。其他的变量也可以使用这个函数来创建

 

find_package(catkin REQUIRED COMPONENTS nodelet)

 

 

 

E.c boost库

 

       如果使用C++和boost库的话,需要调用find_package()函数用于boost,并指定boost的什么方面要用作组件。

 

find_package(Boost REQUIRED COMPONENTS thread)

 

 

 

F.catkin_package()

 

       catkin_package()是Cmake定义的宏,这就需要指定catkin特殊的信息来建立系统,反过来pkg-config 和CMake files。

       这个函数必须在声明任何目标文件(add_library() o和add_executable())前进行调用,这个函数有5个参数。

       1.INCLUDE_DIRS - The exported include paths (i.e. cflags) for the package//包含路径

       2.LIBRARIES - The exported libraries from the project//项目输出的库文件

       3.CATKIN_DEPENDS - Other catkin projects that this project depends on//这个项目调用的其他的catkin项目

       4.DEPENDS - Non-catkin CMake projects that this project depends on//这个项目调用其他的cmake项目

       5.CFG_EXTRAS - Additional configuration options//添加配置选项

       举个例子

 

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

       这表明,“include”路径包含头文件的输出路径。Cmake的环境变量${PROJECT_NAME}评价时候能更早的通过project()的编译。在这个例子中呢,这个变量就是"robot_brain"."roscpp" + "nodelet"是需要立即被编译/运行的库文件,"eigen" + "opencv"是系统依赖项,需要立即运行的。

 

 

G.指定建立目标

 

       目标的建立有很多种形式,但是通常呢,表现为以下两种形式

       生成可执行文件-我们自己可以运行

       库文件目标-在编译或者运行的时候可以被可执行文件调用。

 

G.a 目标命名格式

 

       需要注意的是:catkin目标文件的名字,必须唯一的,不考虑编译或安装的文件夹的名称。这是cmake的要求。然而唯一的名字仅仅是cmake的内部要求。使用set_target_properties()函数就可以将目标修改为其他的名字。举个例子

 

set_target_properties(rviz_image_view
                      PROPERTIES OUTPUT_NAME image_view
                      PREFIX "")

       这样就在编译和安装的时候将目标名rviz_image_view改为image_view

 

 

G.b习惯的输出路径

 

       通常,执行文件和库文件默认的输出路径为catkin文件夹下合理的专门的路径。比如一个包含python的的函数,那么一定会创建一个不同的文件夹来导入python。

       举个例子:

 

set_target_properties(python_module_library
  PROPERTIES LIBRARY_OUTPUT_DIRECTORY ${CATKIN_DEVEL_PREFIX}/${CATKIN_PACKAGE_PYTHON_DESTINATION})

 

 

 

G.c包含路径和库路径  

 

       首先定义目标,首先需要定义源文件的位置,尤其是头文件和库文件的位置   

       1.Include Paths-Where can header files be found for the code (most common in C/C++) being built//代码(大部分是c++/c)需要用到的头文件的位置

       2.Library Paths - Where are libraries located that executable target build against?//可执行目标文件编译时库文件的位置

       3.include_directories(<dir1>, <dir2>, ..., <dirN>)//包含目录

       4.link_directories(<dir1>, <dir2>, ..., <dirN>)//库目录

G.c.1包含目录

       include_directories应该是*_INCLUDE_DIRS自己编写的find_package包含的以及其他添加的目录所包含的内容产生的。如果在用catkin以及boost,那么你的include_directories应该是这样的:

 

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

       第一个include指出这个库的include/directorise也是这个路径的一部分。

 

 

G.c.2链接目录

 

       cmake的link_directories()函数也可以用来添加附加库路径,但这是不推荐的。所有的catkin以及cmake的库再用find_packaged调用时,都自带他们自己的链接路径。target_link_libraries()进行简单的链接。

        举个例子:

 

link_directories(~/my_libs)

 

      

G.d 可执行文件目录

 

         我们用CMake的add_executable()函数,来对编译的可执行文件进行指定。

 

add_executable(myProgram src/main.cpp src/some_file.cpp src/another_file.cpp)

       这个指令会产生一个可执行文件,叫做myProgram。包含三个cpp原文件,main,some_file,another_file。

 

 

G.f库目录

 

       Cmake的add_library()函数,用来添加特殊的库。

      

add_library(${PROJECT_NAME} ${${PROJECT_NAME}_SRCS})

 

 

 

 

G .e  链接目录

 

       使用target_link_libraries() 函数,将库和可执行文件链接起来。一般在调用add_executable()函数之后使用。

 

target_link_libraries(<executableTargetName>, <lib1>, <lib2>, ... <libN>)

       举个例子:

 

 

add_executable(foo src/foo.cpp)
add_library(moo src/moo.cpp)
target_link_libraries(foo moo)  -- This links foo against libmoo.so

       在大多数的情况下呢,不用使用link_directories()函数,因为这个链接会通过函数find_packages自动添加的。

 

       (未完待续)

 

 

 

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

ROS CMakeLists.txt的编写学习 的相关文章

  • Nvidia TX2 定制底板USB2.0无法使用解决方案

  • LiDAR 2 机械激光雷达

    实例分析Valeo SCALA I SICK LMS291 Velodyne HDL 64E Livox DJI MID 70几款激光雷达 xff0c 机械激光雷达特点是通过电动执行器带动镜面 xff0c 透镜或者机体旋转进行扫描 Vale
  • 百分比透明度与16进制透明度的对应关系

    转载请注明出处 xff1a From 李诗雨 http blog csdn net cjm2484836553 article details 78025443 不诗意的女程序猿不是好厨师 最近又是对老项目各种修改 xff0c 这期间经常要
  • LiDAR 3 MEMS激光雷达

    与传统机械雷达相比 xff0c MEMS Micro Electro Mechanical Systems 激光雷达使用微型的MEMS mirror反射光线 xff0c 用微机电执行器代替电机 xff0c 有些厂商也称MEMS激光雷达为固态
  • Docker在CentOS上硬盘使用被占满的问题(备忘)

    摘录至 https github com yeasy docker practice blob master image rm md centosrhel 的用户需要注意的事项 在CentOS上 xff0c 遇到过这个问题 没有细究过 正好
  • ZooKeeper集群安装后无法启动ZooKeeper JMX enabled by default

    ZooKeeper做三节点集群 xff0c 启动后报错如下 xff1a root 64 centos conf zkServer sh start ZooKeeper JMX enabled by default Using config
  • Simulink建模:一阶滤波模型

    本文研究一阶滤波算法的Simulink模型及其代码生成 文章目录 1 一阶滤波算法2 Simulink建模2 1 对公式的理解2 2 建模过程2 3 模型配置 3 模型更新及代码生成3 1 模型更新3 2 代码生成 4 总结 1 一阶滤波算
  • CubeMX配置:FreeRTOS及串口配置

    本文通过CubeMX配置F103RCT6的FreeRTOS和串口 文章目录 1 引入2 配置过程2 1 配置时钟过程2 2 配置FreeRTOS过程2 3 配置串口过程 3 生成工程代码4 测试串口5 总结 1 引入 拿到一个STM32控制
  • Simulink建模:PID控制-串级PID

    本文研究串级PID控制的概念 应用场景以及Simulink模型实现 文章目录 1 问题引入2 串级PID控制3 Simulink建模3 1 建模前的理解3 2 建模过程3 3 代码生成 4 总结 1 问题引入 在之前的博客 Simulink
  • ROS导航中 的位姿描述

    转载出处 xff1a http blog csdn net u013453604 article details 47320237 补充 xff1a turtlebot包如果没有安装成功或者文件夹做了改动运行不起来需要重装就需要uninst
  • Git托管:将本地项目代码上传(push)到自己的Git repository

    首先下载并安装git版本控制软件 xff0c 我安装的是Git 1 9 2 preview20140411 xff0c 这里是我上传的有需要的可以download然后安装即可 http download csdn net detail u0
  • strstr函数用法小结

    strstr 函数原型 xff1a char strstr char str1 char str2 功能就是找出在字符串str1中第一次出项字符串str2的位置 也就是说字符串sr1中要包含有字符串str2 xff0c 找到就返回该字符串位
  • WebSphere宕机问题解决方法总结

    Websphere参数调整 涉及性能的参数 xff1a 1 数据源连接池连接数 2 线程池 xff1a default 参数 ORB THREAD POOL参数 Webcontainer 参数 3 jvm 堆最大最小值 xff0c 线程池调
  • 使用GreenDao存储list集合数据

    转载请注明出处 xff1a From李诗雨 http blog csdn net cjm2484836553 article details 78279493 不诗意的女程序猿不是好厨师 点击下载Demo源代码 xff1a 源码 不知道为什
  • catkin简析

    题记 xff1a 转载一篇catkin总结不错的原创 xff1a http blog csdn net zyh821351004 article details 50388429 catkin简析 catkin 编译支持传入cmake的宏定
  • Package name is not valid解决

    刚刚新建项目 xff0c 将com打成con xff0c 提示 Package name is not valid xff0c 在eclipse中有些单词不能命名
  • 路由器与交换机

    在工作中 xff0c 不管是办公上网还是设备调试 xff0c 经常都会用到路由器与交换机 xff0c 那他们二者的区别是什么呢 xff1f 笔者之前也没太搞明白 恰好出差周末闲来无事 xff0c 特来梳理一下并共享 xff0c 希望对那些跟
  • 用数据驱动思想来设计游戏

    游戏由两部分组成 xff0c 逻辑和数据 这是一种对游戏的有效划分 逻辑部分定义游戏引擎的核心原则和算法 xff0c 数据部分则提供其内容 和行为的具体细节 在最初的游戏开发的过程中 xff0c 大家总是喜欢将逻辑和数据都写入代码中 xff
  • 架构师之路:一个架构师需要掌握的知识技能

    Java团长 2017 04 15 21 30 没有设计的思想 xff0c 你就不能成为一名架构师 架构师是一个能撸的了一手好代码 xff0c 画的了一个漂亮的UML 原型 xff0c 写的了一篇技术文档 xff0c 更加能解决好项目关键技
  • 【Python】Windows下PyCharm安装Numpy包及无法安装问题解决方案

    step1 打开pycharm安装目录 xff0c 路径如下图 xff1a step2 在上个界面 xff0c 按 shift 43 右键 xff0c 打开命令窗口 xff0c 检查pip版本是否为最新 xff0c 如下图 xff1a st

随机推荐