关于ROS包中CMakeList.txt中几个常用的命令的作用 ——————(二)

2024-06-22 16:38

本文主要是介绍关于ROS包中CMakeList.txt中几个常用的命令的作用 ——————(二),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

(5)catkin_package()

(6)add_library()   

(7)add_dependencies( []...)


接(一)关于ROS包中CMakeList.txt中几个常用的命令的作用 ——————(一)_u012057432的博客-CSDN博客,以下是其他相关的配置命令,有些不是必要的,但是却十分常用,但是也是十分重要的。

(5)catkin_package()

如果ROS包B依赖ROS包A,那么,为了使包B能够使用find_package()指令正常寻找到A,并获得包A的相关变量(头文件路路径,库路径等)需要提前在包A中的CMakeList.txt中使用Catkin_package()宏做出相关的配置,该命令宏能把关于A的得到相关的信息“传递”给包B的find_package()指令。也就是说包A的Catkin_package()宏是为了包B的find_package()服务的。

对于默认的书写模板

catkin_package(INCLUDE_DIRS includeLIBRARIES pose_estimationCATKIN_DEPENDS pcl_conversions pcl_ros roscpp sensor_msgsDEPENDS system_lib
)

其中:

  • INCLUDE_DIRS  include  :包A中如果定义的有头文件文件夹的话,就把该文件夹地址传给B,作为B  camke过程中的变量A_INCLUDE_DIRS.
  • LIBRARIES  pose_estimation  :包A中生成的库文件(pose_estimation)的地址传给B,作为B  camke过程中的变量pose_estimation_LIBRARIES.
  • CATKIN_DEPENDS pcl_conversions pcl_ros roscpp sensor_msgs   :包A依赖的一些catkin程序包,可以使得B递归依赖它们,而不用手动再次在B中去依赖它们。
  • DEPENDS system_lib    :包A中依赖的一些非catkin程序包,可以使得B递归依赖(递归查找它们的库路径,头文件路径等等)它们,而不用手动再次在B中去依赖它们。

(6)add_library()   

该指令,主要用于自己创建库文件,一般放在target_link_libraries之前,具体的命令是

add_library(<name> [STATIC | SHARED | MODULE] [EXCLUDE_FROM_ALL] [source1] [source2] [...])

该命令用于使得gcc将制定的source文件生成名为<name>的库文件(生成的实际名称会根据系统平台的不同,有不同的名字,比如linux中,会生成lib<name>.a 以lib开头告诉系统这是库文件),后面的[STATIC | SHARED | MODULE]代表希望生成“静态库”、“动态库”、“模组库?”(这个模组库不会进行静态链接,但是可能会通过dlopen之类的方法动态加载,不懂这个)。如果不显式的标出来是哪种,就会根据BUILD_SHARED_LIBS的值(它本身是一个cmake的标志变量,专门用于指定add_library的生成类型),是ON还是OFF,ON就是构建动态库,OFF就是构建静态库。而BUILD_SHARED_LIBS的值一般在进行cmake指令的时候给出,比如,在编译时候执行:

cmake -DBUILD_SHARED_LIBS=OFF ..

如果没有指定BUILD_SHARED_LIBS的值,默认就是OFF,因此,当不指定[STATIC | SHARED | MODULE]参数的时候,就是默认构建静态库。

例子:

### Build simple_grasping library
add_library(simple_graspingsrc/cloud_tools.cppsrc/object_support_segmentation.cppsrc/shape_extraction.cppsrc/shape_grasp_planner.cpp
)

上面,是把自己的src中的不包含main函数的cpp文件,构建成了静态库,合理且有意思的是,这个库可以使用target_link_libraries指令,与自己包含main函数的cpp的目标文件进行链接,这样就可以避免在add_executable写一堆cpp具体名称。

完整一点的例子:

### 构建名为simple_grasping的静态库,此语句之后,gcc就会把它们编译成二进制文件
add_library(simple_graspingsrc/cloud_tools.cppsrc/object_support_segmentation.cppsrc/shape_extraction.cppsrc/shape_grasp_planner.cpp
)
###把库的目标文件和外部库文件进行链接,这样才能构建出完整的库?
###刚试了一下,并不需要进行链接外部的库,因为它只是被用到了下面与basic_grasping_perception进行链###接,可以在后面一起链接
target_link_libraries(simple_grasping${Boost_LIBRARIES}${catkin_LIBRARIES}${PCL_LIBRARIES}
)
### 自己的main目标文件,注意没有其他的cpp文件,而是用库代替了,很方便
add_executable(basic_grasping_perception src/basic_grasping_perception.cpp)
###看到,在这里把自己的simple_grasping库和外部的库,以及main目标文件进行了链接。
target_link_libraries(basic_grasping_perceptionsimple_grasping${Boost_LIBRARIES}${catkin_LIBRARIES}${PCL_LIBRARIES}
)

(7)add_dependencies(<target> [<target-dependency>]...)

这个一般放在target_link_libraries之后,主要是告诉cmake,一个顶层的target(本target)依赖于另一个顶层的target(<target-dependency>),来保证被依赖的<target-dependency>在本target之前构建完毕。

所谓的顶层target值得是用add_executable()、add_library()或add_custom_target() 指令成的目标对象 ,一般可以简单理解为,该命令用于确保另外一个自己写的程序包B先于本包A构建完成。

这篇关于关于ROS包中CMakeList.txt中几个常用的命令的作用 ——————(二)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1084839

相关文章

Linux join命令的使用及说明

《Linuxjoin命令的使用及说明》`join`命令用于在Linux中按字段将两个文件进行连接,类似于SQL的JOIN,它需要两个文件按用于匹配的字段排序,并且第一个文件的换行符必须是LF,`jo... 目录一. 基本语法二. 数据准备三. 指定文件的连接key四.-a输出指定文件的所有行五.-o指定输出

Linux jq命令的使用解读

《Linuxjq命令的使用解读》jq是一个强大的命令行工具,用于处理JSON数据,它可以用来查看、过滤、修改、格式化JSON数据,通过使用各种选项和过滤器,可以实现复杂的JSON处理任务... 目录一. 简介二. 选项2.1.2.2-c2.3-r2.4-R三. 字段提取3.1 普通字段3.2 数组字段四.

MyBatis常用XML语法详解

《MyBatis常用XML语法详解》文章介绍了MyBatis常用XML语法,包括结果映射、查询语句、插入语句、更新语句、删除语句、动态SQL标签以及ehcache.xml文件的使用,感兴趣的朋友跟随小... 目录1、定义结果映射2、查询语句3、插入语句4、更新语句5、删除语句6、动态 SQL 标签7、ehc

java中ssh2执行多条命令的四种方法

《java中ssh2执行多条命令的四种方法》本文主要介绍了java中ssh2执行多条命令的四种方法,包括分号分隔、管道分隔、EOF块、脚本调用,可确保环境配置生效,提升操作效率,具有一定的参考价值,感... 目录1 使用分号隔开2 使用管道符号隔开3 使用写EOF的方式4 使用脚本的方式大家平时有没有遇到自

Python打包成exe常用的四种方法小结

《Python打包成exe常用的四种方法小结》本文主要介绍了Python打包成exe常用的四种方法,包括PyInstaller、cx_Freeze、Py2exe、Nuitka,文中通过示例代码介绍的非... 目录一.PyInstaller11.安装:2. PyInstaller常用参数下面是pyinstal

Linux命令rm如何删除名字以“-”开头的文件

《Linux命令rm如何删除名字以“-”开头的文件》Linux中,命令的解析机制非常灵活,它会根据命令的开头字符来判断是否需要执行命令选项,对于文件操作命令(如rm、ls等),系统默认会将命令开头的某... 目录先搞懂:为啥“-”开头的文件删不掉?两种超简单的删除方法(小白也能学会)方法1:用“--”分隔命

Python 常用数据类型详解之字符串、列表、字典操作方法

《Python常用数据类型详解之字符串、列表、字典操作方法》在Python中,字符串、列表和字典是最常用的数据类型,它们在数据处理、程序设计和算法实现中扮演着重要角色,接下来通过本文给大家介绍这三种... 目录一、字符串(String)(一)创建字符串(二)字符串操作1. 字符串连接2. 字符串重复3. 字

Spring的基础事务注解@Transactional作用解读

《Spring的基础事务注解@Transactional作用解读》文章介绍了Spring框架中的事务管理,核心注解@Transactional用于声明事务,支持传播机制、隔离级别等配置,结合@Tran... 目录一、事务管理基础1.1 Spring事务的核心注解1.2 注解属性详解1.3 实现原理二、事务事

python语言中的常用容器(集合)示例详解

《python语言中的常用容器(集合)示例详解》Python集合是一种无序且不重复的数据容器,它可以存储任意类型的对象,包括数字、字符串、元组等,下面:本文主要介绍python语言中常用容器(集合... 目录1.核心内置容器1. 列表2. 元组3. 集合4. 冻结集合5. 字典2.collections模块

Redis 的 SUBSCRIBE命令详解

《Redis的SUBSCRIBE命令详解》Redis的SUBSCRIBE命令用于订阅一个或多个频道,以便接收发送到这些频道的消息,本文给大家介绍Redis的SUBSCRIBE命令,感兴趣的朋友跟随... 目录基本语法工作原理示例消息格式相关命令python 示例Redis 的 SUBSCRIBE 命令用于订