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

相关文章

MySQL日志UndoLog的作用

《MySQL日志UndoLog的作用》UndoLog是InnoDB用于事务回滚和MVCC的重要机制,本文主要介绍了MySQL日志UndoLog的作用,文中介绍的非常详细,对大家的学习或者工作具有一定的... 目录一、Undo Log 的作用二、Undo Log 的分类三、Undo Log 的存储四、Undo

Java实现字符串大小写转换的常用方法

《Java实现字符串大小写转换的常用方法》在Java中,字符串大小写转换是文本处理的核心操作之一,Java提供了多种灵活的方式来实现大小写转换,适用于不同场景和需求,本文将全面解析大小写转换的各种方法... 目录前言核心转换方法1.String类的基础方法2. 考虑区域设置的转换3. 字符级别的转换高级转换

Python使用Matplotlib和Seaborn绘制常用图表的技巧

《Python使用Matplotlib和Seaborn绘制常用图表的技巧》Python作为数据科学领域的明星语言,拥有强大且丰富的可视化库,其中最著名的莫过于Matplotlib和Seaborn,本篇... 目录1. 引言:数据可视化的力量2. 前置知识与环境准备2.1. 必备知识2.2. 安装所需库2.3

C++ move 的作用详解及陷阱最佳实践

《C++move的作用详解及陷阱最佳实践》文章详细介绍了C++中的`std::move`函数的作用,包括为什么需要它、它的本质、典型使用场景、以及一些常见陷阱和最佳实践,感兴趣的朋友跟随小编一起看... 目录C++ move 的作用详解一、一句话总结二、为什么需要 move?C++98/03 的痛点⚡C++

MyBatis配置文件中最常用的设置

《MyBatis配置文件中最常用的设置》文章主要介绍了MyBatis配置的优化方法,包括引用外部的properties配置文件、配置外置以实现环境解耦、配置文件中最常用的6个核心设置以及三种常用的Ma... 目录MyBATis配置优化mybatis的配置中引用外部的propertis配置文件⚠️ 注意事项X

JAVA transient 关键字作用详解

《JAVAtransient关键字作用详解》Java的transient关键字用于修饰成员变量,使其不参与序列化过程,通过自定义序列化方法,可以手动控制transient变量的序列化行为,本文给大... 目录一、transient关键字作用二、原理详解三、典型使用场景四、代码示例五、注意事项六、与 stat

一文详解Java常用包有哪些

《一文详解Java常用包有哪些》包是Java语言提供的一种确保类名唯一性的机制,是类的一种组织和管理方式、是一组功能相似或相关的类或接口的集合,:本文主要介绍Java常用包有哪些的相关资料,需要的... 目录Java.langjava.utiljava.netjava.iojava.testjava.sql

Spring Boot/Spring MVC核心注解的作用详解

《SpringBoot/SpringMVC核心注解的作用详解》本文详细介绍了SpringBoot和SpringMVC中最常用的15个核心注解,涵盖了请求路由映射、参数绑定、RESTfulAPI、... 目录一、Spring/Spring MVC注解的核心作用二、请求映射与RESTful API注解系列2.1

Springmvc常用的注解代码示例

《Springmvc常用的注解代码示例》本文介绍了SpringMVC中常用的控制器和请求映射注解,包括@Controller、@RequestMapping等,以及请求参数绑定注解,如@Request... 目录一、控制器与请求映射注解二、请求参数绑定注解三、其他常用注解(扩展)四、注解使用注意事项一、控制

Redis 命令详解与实战案例

《Redis命令详解与实战案例》本文详细介绍了Redis的基础知识、核心数据结构与命令、高级功能与命令、最佳实践与性能优化,以及实战应用场景,通过实战案例,展示了如何使用Redis构建高性能应用系统... 目录Redis 命令详解与实战案例一、Redis 基础介绍二、Redis 核心数据结构与命令1. 字符