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

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

C++ 中的 if-constexpr语法和作用

《C++中的if-constexpr语法和作用》if-constexpr语法是C++17引入的新语法特性,也被称为常量if表达式或静态if(staticif),:本文主要介绍C++中的if-c... 目录1 if-constexpr 语法1.1 基本语法1.2 扩展说明1.2.1 条件表达式1.2.2 fa

css中的 vertical-align与line-height作用详解

《css中的vertical-align与line-height作用详解》:本文主要介绍了CSS中的`vertical-align`和`line-height`属性,包括它们的作用、适用元素、属性值、常见使用场景、常见问题及解决方案,详细内容请阅读本文,希望能对你有所帮助... 目录vertical-ali

Linux上设置Ollama服务配置(常用环境变量)

《Linux上设置Ollama服务配置(常用环境变量)》本文主要介绍了Linux上设置Ollama服务配置(常用环境变量),Ollama提供了多种环境变量供配置,如调试模式、模型目录等,下面就来介绍一... 目录在 linux 上设置环境变量配置 OllamPOgxSRJfa手动安装安装特定版本查看日志在

Java常用注解扩展对比举例详解

《Java常用注解扩展对比举例详解》:本文主要介绍Java常用注解扩展对比的相关资料,提供了丰富的代码示例,并总结了最佳实践建议,帮助开发者更好地理解和应用这些注解,需要的朋友可以参考下... 目录一、@Controller 与 @RestController 对比二、使用 @Data 与 不使用 @Dat

Mysql中深分页的五种常用方法整理

《Mysql中深分页的五种常用方法整理》在数据量非常大的情况下,深分页查询则变得很常见,这篇文章为大家整理了5个常用的方法,文中的示例代码讲解详细,大家可以根据自己的需求进行选择... 目录方案一:延迟关联 (Deferred Join)方案二:有序唯一键分页 (Cursor-based Paginatio

Python实现常用文本内容提取

《Python实现常用文本内容提取》在日常工作和学习中,我们经常需要从PDF、Word文档中提取文本,本文将介绍如何使用Python编写一个文本内容提取工具,有需要的小伙伴可以参考下... 目录一、引言二、文本内容提取的原理三、文本内容提取的设计四、文本内容提取的实现五、完整代码示例一、引言在日常工作和学

Redis中的常用的五种数据类型详解

《Redis中的常用的五种数据类型详解》:本文主要介绍Redis中的常用的五种数据类型详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Redis常用的五种数据类型一、字符串(String)简介常用命令应用场景二、哈希(Hash)简介常用命令应用场景三、列表(L

浅析CSS 中z - index属性的作用及在什么情况下会失效

《浅析CSS中z-index属性的作用及在什么情况下会失效》z-index属性用于控制元素的堆叠顺序,值越大,元素越显示在上层,它需要元素具有定位属性(如relative、absolute、fi... 目录1. z-index 属性的作用2. z-index 失效的情况2.1 元素没有定位属性2.2 元素处

python中time模块的常用方法及应用详解

《python中time模块的常用方法及应用详解》在Python开发中,时间处理是绕不开的刚需场景,从性能计时到定时任务,从日志记录到数据同步,时间模块始终是开发者最得力的工具之一,本文将通过真实案例... 目录一、时间基石:time.time()典型场景:程序性能分析进阶技巧:结合上下文管理器实现自动计时