关于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

相关文章

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

ROS话题通信流程自定义数据格式

ROS话题通信流程自定义数据格式 需求流程实现步骤定义msg文件编辑配置文件编译 在 ROS 通信协议中,数据载体是一个较为重要组成部分,ROS 中通过 std_msgs 封装了一些原生的数据类型,比如:String、Int32、Int64、Char、Bool、Empty… 但是,这些数据一般只包含一个 data 字段,结构的单一意味着功能上的局限性,当传输一些复杂的数据,比如:

React+TS前台项目实战(十七)-- 全局常用组件Dropdown封装

文章目录 前言Dropdown组件1. 功能分析2. 代码+详细注释3. 使用方式4. 效果展示 总结 前言 今天这篇主要讲全局Dropdown组件封装,可根据UI设计师要求自定义修改。 Dropdown组件 1. 功能分析 (1)通过position属性,可以控制下拉选项的位置 (2)通过传入width属性, 可以自定义下拉选项的宽度 (3)通过传入classN

Linux 下的Vim命令宝贝

vim 命令详解(转自:https://www.cnblogs.com/usergaojie/p/4583796.html) vi: Visual Interface 可视化接口 vim: VI iMproved VI增强版 全屏编辑器,模式化编辑器 vim模式: 编辑模式(命令模式)输入模式末行模式 模式转换: 编辑-->输入: i: 在当前光标所在字符的前面,转为输入模式

Java面试八股之JVM参数-XX:+UseCompressedOops的作用

JVM参数-XX:+UseCompressedOops的作用 JVM参数-XX:+UseCompressedOops的作用是启用对象指针压缩(Ordinary Object Pointers compression)。这一特性主要应用于64位的Java虚拟机中,目的是为了减少内存使用。在传统的64位系统中,对象引用(即指针)通常占用8字节(64位),而大部分应用程序实际上并不需要如此大的地址空间

帆软报表常用操作

欢迎来到我的博客,代码的世界里,每一行都是一个故事 🎏:你只管努力,剩下的交给时间 🏠 :小破站 帆软报表常用操作 多序号实现使用数据集作为参数空白页或者竖线页修改页面Title金额,或者保留两位小数等等设置日期格式显示图片使用公式 多序号实现 所用函数为SEQ(),如果一张报表中需要用到多个序号,那么就需要加入参数SEQ(1),SEQ(

常用MQ消息中间件Kafka、ZeroMQ和RabbitMQ对比及RabbitMQ详解

1、概述   在现代的分布式系统和实时数据处理领域,消息中间件扮演着关键的角色,用于解决应用程序之间的通信和数据传递的挑战。在众多的消息中间件解决方案中,Kafka、ZeroMQ和RabbitMQ 是备受关注和广泛应用的代表性系统。它们各自具有独特的特点和优势,适用于不同的应用场景和需求。   Kafka 是一个高性能、可扩展的分布式消息队列系统,被设计用于处理大规模的数据流和实时数据传输。它

Linux中拷贝 cp命令中拷贝所有的写法详解

This text from: http://www.jb51.net/article/101641.htm 一、预备  cp就是拷贝,最简单的使用方式就是: cp oldfile newfile 但这样只能拷贝文件,不能拷贝目录,所以通常用: cp -r old/ new/ 那就会把old目录整个拷贝到new目录下。注意,不是把old目录里面的文件拷贝到new目录,

XMG 常用的手势

// 创建点按手势     UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(tap:)];    tap.numberOfTabsRequired=2; //点击的次数

Avalonia 常用控件二 Menu相关

1、Menu 添加代码如下 <Button HorizontalAlignment="Center" Content="Menu/菜单"><Button.Flyout><MenuFlyout><MenuItem Header="打开"/><MenuItem Header="-"/><MenuItem Header="关闭"/></MenuFlyout></Button.Flyout></B