news 2026/5/1 3:27:50

colcon build 会做什么?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
colcon build 会做什么?

colcon build 会生成什么? 为什么会生成这些?

colcon build是 ROS 2 中用于构建(编译和安装)整个工作空间中所有包的核心命令。它会根据你的源代码(C++、Python 等)生成一系列文件和目录,目的是让这些包能在 ROS 2 系统中被正确发现、运行和使用

下面我们详细解释:


📁 一、colcon build默认会在工作空间根目录下生成4 个关键目录

假设你的工作空间是~/ros2_ws,执行:

cd~/ros2_ws colcon build
ros2_ws/ ├── src/ ← 你写的源码(不会动) ├── build/ ← 🔧 编译中间产物(类似 CMake 的 build 目录) ├── install/ ← 🚀 安装结果(最终可部署的“成品”) └── log/ ← 📝 构建日志(调试用)

🔍 二、每个目录的作用和生成原因

1️⃣build/—— 编译过程的“工地”

✅ 生成什么?
  • 每个包一个子目录(如build/my_pkg/
  • 里面包含:
    • CMake 生成的 Makefile / Ninja 文件
    • 编译产生的.o.so、临时文件
    • Python 包的构建缓存(如build/lib/
❓ 为什么需要?
  • 隔离编译过程:避免污染源码(src/应保持干净)
  • 支持增量编译:下次只重新编译修改过的部分
  • 多配置支持:未来可支持 debug/release 并存(通过--cmake-args

💡 类似于你在普通 CMake 项目中手动创建的build/目录。


2️⃣install/—— 最终“交付物”(最重要!)

✅ 生成什么?

这是 ROS 2真正能运行的环境,结构如下:

install/ ├── my_cpp_pkg/ │ ├── lib/ │ │ └── my_cpp_pkg/ ← C++ 可执行文件、库 │ ├── share/ │ │ └── my_cpp_pkg/ │ │ ├── package.xml │ │ ├── cmake/ ← CMake 配置文件(供其他包依赖) │ │ └── ... │ └── local_setup.bash ← 包级环境脚本 │ ├── my_py_pkg/ │ ├── lib/python3.x/site-packages/my_py_pkg/ ← Python 模块 │ └── share/my_py_pkg/ ← package.xml, launch 文件等 │ ├── setup.bash ← 🌟 工作空间总入口(必须 source) ├── local_setup.bash ← 本工作空间的环境设置 ├── _local_setup_util_sh.py ← 辅助脚本(生成环境变量) └── COLCON_IGNORE ← 标记此目录为 colcon 前缀
❓ 为什么需要?

ROS 2 采用“安装即部署”的设计理念:

目的实现方式
让系统能找到你的包通过setup.bash设置PATH,PYTHONPATH,AMENT_PREFIX_PATH
支持包之间互相依赖C++ 包导出.cmake文件,Python 包安装到标准 site-packages
与系统 ROS 隔离所有内容集中在install/,不污染/usr
支持 overlay(叠加)可以source /opt/ros/humble/setup.bashsource install/setup.bash

只有source install/setup.bash后,你的节点才能被ros2 run找到!


3️⃣log/—— 构建日志(调试神器)

✅ 生成什么?
  • 每次构建一个时间戳目录(如log/latest/log/2025-12-14_22-05-00/
  • 里面包含:
    • build_my_pkg.log:每个包的完整编译输出
    • colcon_build.log:总体日志
    • 错误时可精准定位
❓ 为什么需要?
  • 编译失败时,终端可能只显示最后几行错误
  • 日志文件保留完整上下文,便于排查(尤其是 CI/CD 环境)

🛠️ 三、额外生成的“元信息”文件(关键但常被忽略)

除了目录,colcon还会生成一些控制文件

文件作用
install/COLCON_IGNORE告诉 colcon:“这是一个安装前缀,不要再递归扫描”
install/_local_setup_util_sh.pyPython 脚本,动态生成环境变量设置命令(前面讲过)
install/share/<pkg>/package.bash包级别的环境扩展脚本(由 ament 生成)

🌟 四、为什么这样设计?——ROS 2 的哲学

  1. 可重复性(Reproducibility)
    install/是自包含的,可以打包分发到其他机器(只要架构兼容)。
  2. 环境隔离
    不同工作空间互不影响,避免“全局安装”导致的版本冲突。
  3. 与上游 ROS 兼容
    install/的结构和/opt/ros/humble/完全一致,所以能无缝 overlay。
  4. 语言无关
    无论是 C++、Python、还是混合包,都统一安装到install/,由setup.bash统一激活。

✅ 举个实际例子

你写了一个 C++ 节点talker,在my_pkg中。

执行colcon build后:

  • 可执行文件 →install/my_pkg/lib/my_pkg/talker
  • ros2 run my_pkg talker能运行 → 因为setup.bashinstall/my_pkg/lib加入了PATH
  • 其他包想依赖my_pkg→ 通过find_package(my_pkg REQUIRED)找到install/my_pkg/share/my_pkg/cmake/...

🔚 总结:colcon build生成什么?为什么?

生成项用途必要性
build/编译中间文件⚙️ 必需(构建过程)
install/最终可运行的包集合🚀核心产出(没有它,包无法被 ROS 使用)
log/构建日志🐞 调试必备
setup.bash等脚本激活环境🔑必须 source 才能使用你的包

💡记住:colcon build不只是“编译代码”,更是“构建一个可被 ROS 2 识别和使用的软件环境”。

这就是为什么 ROS 2 强调“source install/setup.bash”—— 它是连接你代码和 ROS 生态系统的桥梁 🌉

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 23:51:11

Linux常见工具使用方法

&#x1f3ac; 个人主页&#xff1a;Vect个人主页&#x1f3ac; GitHub&#xff1a;Vect的代码仓库&#x1f525; 个人专栏: 《数据结构与算法》《C学习之旅》《Linux》⛺️Per aspera ad astra. 文章目录Makefile0. 简单代码演示1. Makefile结构及规则变量定义部分默认目标部分…

作者头像 李华
网站建设 2026/4/18 8:35:23

springboot房屋租赁系统(11487)

有需要的同学&#xff0c;源代码和配套文档领取&#xff0c;加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码&#xff08;前后端源代码SQL脚本&#xff09;配套文档&#xff08;LWPPT开题报告&#xff09;远程调试控屏包运行 三、技术介绍 Java…

作者头像 李华
网站建设 2026/4/26 11:00:32

数据页和索引页有什么区别?

1.索引页&#xff0c;是指向数据页的路径&#xff0c;不直接包含完整的行数据 2.主键索引(聚簇索引)的叶子节点就是数据页&#xff0c;直接存储完整的行数据 3.索引页存储主键索引和二级索引的非叶子节点的索引键值和指针&#xff0c;存储了二级索引叶子节点的索引键值和主键值…

作者头像 李华
网站建设 2026/4/20 15:20:02

YOLOX-Nano彩色盒子目标检测:8x8批量训练300轮COCO数据集优化方案

1. YOLOX-Nano彩色盒子目标检测&#xff1a;8x8批量训练300轮COCO数据集优化方案 在计算机视觉领域&#xff0c;目标检测是一项基础且重要的任务&#xff0c;广泛应用于自动驾驶、安防监控、医疗影像分析等多个领域。本文将详细介绍如何使用YOLOX-Nano模型进行彩色盒子目标检测…

作者头像 李华
网站建设 2026/4/27 21:13:35

系统流异世探险动态漫制作2025推荐,全方位解析

系统流异世探险动态漫制作2025推荐&#xff0c;全方位解析在当今的动态漫制作领域&#xff0c;系统流异世探险题材凭借其独特的魅力吸引了众多观众的目光。然而&#xff0c;要制作出一部优秀的系统流异世探险动态漫并非易事&#xff0c;需要在多个方面进行精心策划和制作。本文…

作者头像 李华