CMake笔记之ros的catkin_make中add_dependencies用法对比:单一目标依赖 vs 多目标依赖

CMake笔记之ros的catkin_make中add_dependencies用法对比:单一目标依赖 vs 多目标依赖

复制代码
add_dependencies(publisher custom_msgs_pkg_generate_messages_cpp)

## 添加依赖,确保消息头文件生成后再编译
add_dependencies(publisher ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})

这两段代码都涉及 CMakeadd_dependencies 的使用,用于指定构建依赖关系,但它们的作用和适用场景有所不同。以下是详细的区别:

第一段代码

cmake 复制代码
add_dependencies(publisher custom_msgs_pkg_generate_messages_cpp)
含义:
  • publisher:目标(target),通常是一个可执行文件或库。
  • custom_msgs_pkg_generate_messages_cpp :这是一个生成消息和服务代码的目标,通常由 catkin 自动生成,用于支持自定义消息类型(custom_msgs_pkg 是消息包名,generate_messages_cpp 是生成 C++ 消息代码的部分)。
功能:
  • 这段代码指定了 publisher 依赖于 custom_msgs_pkg_generate_messages_cpp
  • 在构建 publisher 之前,custom_msgs_pkg_generate_messages_cpp 必须先完成。
  • 适用场景 :当你的节点(如 publisher)依赖自定义消息,而这些消息是由 custom_msgs_pkg 定义的,需要确保这些消息的生成代码(cpp 文件)在构建 publisher 时已经可用。

第二段代码

cmake 复制代码
add_dependencies(publisher ${${PROJECT_NAME}_EXPORTED_TARGETS} ${catkin_EXPORTED_TARGETS})
含义:
  • publisher:同样是目标(目标节点或库)。
  • ${${PROJECT_NAME}_EXPORTED_TARGETS}
    • 这是当前项目(PROJECT_NAME)的导出目标,通常包括生成的消息、服务或其他依赖项。
    • catkin_package() 自动设置,用于关联当前项目的构建目标。
  • ${catkin_EXPORTED_TARGETS}
    • 这是来自依赖包(find_package(catkin REQUIRED COMPONENTS ...) 中指定的包)的导出目标。
    • 包括其他依赖包的消息、服务或其他生成目标。
功能:
  • 这段代码指定了 publisher 的依赖关系:
    • 当前项目的所有导出目标(PROJECT_NAME 的生成目标)。
    • 所有依赖包的导出目标(catkin 中依赖的其他包)。
  • 适用场景 :当 publisher 依赖多个目标,比如:
    • 本项目中生成的消息或服务。
    • 其他包中生成的消息或服务,需要确保所有依赖目标都已构建。

区别总结

方面 第一段代码 第二段代码
依赖范围 单一目标(custom_msgs_pkg_generate_messages_cpp 当前项目导出的所有目标及依赖包的导出目标
适用场景 仅依赖某个特定的目标(如某个包的消息生成) 依赖多个目标,通常是当前项目及依赖包的所有生成目标
灵活性 较低(仅关注单一目标) 较高(涵盖当前项目及依赖包的所有导出目标)
典型用途 用于单一消息包的生成依赖 用于复杂依赖场景,特别是包含多个消息、服务或自定义目标的项目

示例场景

  1. 第一段代码场景:

    • 你的项目中只有一个单一的消息包 custom_msgs_pkg,并且 publisher 只依赖于 custom_msgs_pkg 中的消息。
    • 则可以简单地使用第一种写法,让 publisher 依赖于 custom_msgs_pkg_generate_messages_cpp
  2. 第二段代码场景:

    • 你的项目有多个消息包,或者依赖多个其他包的消息和服务(例如 std_msgsgeometry_msgs)。
    • 你希望 publisher 自动依赖于所有相关生成目标,而无需手动指定每个目标。

总结建议:

  • 如果依赖简单(比如一个特定的消息包),可以用第一种方式。
  • 如果依赖复杂,涉及多个包或多个消息/服务生成目标,推荐使用第二种方式,因为它更通用且易于维护。
相关推荐
格兰芬多呼神护卫10 分钟前
中国电信 TeleAI 开源 KungfuBot / PBHC 框架分析笔记
笔记·开源
阿i索31 分钟前
【C++学习笔记】【基础】4.string类(2)——模拟实现
c++·笔记·学习
数据皮皮侠AI1 小时前
上市公司战略性新兴产业专利数据库(2003-2024)
大数据·人工智能·笔记·机器学习·回归
袁小皮皮不皮1 小时前
6.HCIP OSPF域间防环机制与虚链路
服务器·网络·笔记·网络协议·学习·智能路由器
一口吃俩胖子1 小时前
【脉宽调制DCDC功率变换学习笔记026】补偿设计和闭环性能
笔记·学习
三品吉他手会点灯1 小时前
C语言学习笔记 - 48.流程控制2 - 什么是流程控制
c语言·开发语言·笔记·学习
闪闪发亮的小星星1 小时前
椎角的概念以及和方位、俯仰的关系
笔记
杨先生哦2 小时前
【2026热端攻防系列 3/12】反射型&存储型XSS全解:AI批量免杀、WAF绕过与企业级防御
前端·人工智能·笔记·web安全·xss
问心无愧05132 小时前
ctf show web入门123
android·前端·笔记
لا معنى له2 小时前
SF2Net: Sequence Feature Fusion Network for Palmprint Verification
人工智能·笔记·学习·机器学习