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

相关文章

golang中reflect包的常用方法

《golang中reflect包的常用方法》Go反射reflect包提供类型和值方法,用于获取类型信息、访问字段、调用方法等,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值... 目录reflect包方法总结类型 (Type) 方法值 (Value) 方法reflect包方法总结

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

python常用的正则表达式及作用

《python常用的正则表达式及作用》正则表达式是处理字符串的强大工具,Python通过re模块提供正则表达式支持,本文给大家介绍python常用的正则表达式及作用详解,感兴趣的朋友跟随小编一起看看吧... 目录python常用正则表达式及作用基本匹配模式常用正则表达式示例常用量词边界匹配分组和捕获常用re

postgresql数据库基本操作及命令详解

《postgresql数据库基本操作及命令详解》本文介绍了PostgreSQL数据库的基础操作,包括连接、创建、查看数据库,表的增删改查、索引管理、备份恢复及退出命令,适用于数据库管理和开发实践,感兴... 目录1. 连接 PostgreSQL 数据库2. 创建数据库3. 查看当前数据库4. 查看所有数据库

Java 继承和多态的作用及好处

《Java继承和多态的作用及好处》文章讲解Java继承与多态的概念、语法及应用,继承通过extends复用父类成员,减少冗余;多态实现方法重写与向上转型,提升灵活性与代码复用性,动态绑定降低圈复杂度... 目录1. 继承1.1 什么是继承1.2 继承的作用和好处1.3 继承的语法1.4 子类访问父类里面的成

linux重启命令有哪些? 7个实用的Linux系统重启命令汇总

《linux重启命令有哪些?7个实用的Linux系统重启命令汇总》Linux系统提供了多种重启命令,常用的包括shutdown-r、reboot、init6等,不同命令适用于不同场景,本文将详细... 在管理和维护 linux 服务器时,完成系统更新、故障排查或日常维护后,重启系统往往是必不可少的步骤。本文

gitlab安装及邮箱配置和常用使用方式

《gitlab安装及邮箱配置和常用使用方式》:本文主要介绍gitlab安装及邮箱配置和常用使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1.安装GitLab2.配置GitLab邮件服务3.GitLab的账号注册邮箱验证及其分组4.gitlab分支和标签的

nginx启动命令和默认配置文件的使用

《nginx启动命令和默认配置文件的使用》:本文主要介绍nginx启动命令和默认配置文件的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录常见命令nginx.conf配置文件location匹配规则图片服务器总结常见命令# 默认配置文件启动./nginx

Python常用命令提示符使用方法详解

《Python常用命令提示符使用方法详解》在学习python的过程中,我们需要用到命令提示符(CMD)进行环境的配置,:本文主要介绍Python常用命令提示符使用方法的相关资料,文中通过代码介绍的... 目录一、python环境基础命令【Windows】1、检查Python是否安装2、 查看Python的安

基于Python实现一个Windows Tree命令工具

《基于Python实现一个WindowsTree命令工具》今天想要在Windows平台的CMD命令终端窗口中使用像Linux下的tree命令,打印一下目录结构层级树,然而还真有tree命令,但是发现... 目录引言实现代码使用说明可用选项示例用法功能特点添加到环境变量方法一:创建批处理文件并添加到PATH1