news 2026/6/9 13:04:54

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/6/9 19:41:55

AI赋能医学教育:从知识传递到能力塑造的革命

当医学生不再局限于书本图解和标本观察&#xff0c;而是能与AI虚拟病人沉浸式问诊、借助数字人解剖台探索人体奥秘&#xff0c;医学教育的传统边界正被人工智能彻底打破。广东医科大学AI医学院打造的“师-机-生”协同共创模式&#xff0c;正是AI技术深度赋能教育领域的生动实践…

作者头像 李华
网站建设 2026/6/9 22:13:15

初步了解Next.js

Next.js是React的一个超集框架&#xff0c;为什么会有Next.js这个框架存在呢&#xff0c;因为它可以解决React的痛点&#xff0c;就是客户端渲染 Next.js的一大亮点就是支持多模式混合渲染&#xff0c;分别有四种模式&#xff0c;CSR&#xff0c;SSR&#xff0c;SSG&#xff0c…

作者头像 李华
网站建设 2026/6/9 22:13:37

使用cmake构建Cplusplus版运行时库-–-behaviac

原文 请首先到/language/zh/downloads/下载或克隆源码。 缺省的&#xff0c;我们使用cmake来生成对应平台的项目文件&#xff08;sln或make文件等&#xff09;。 但cmake不是必须的&#xff0c;也可以选择自己喜欢的方式创建自己的项目文件。比如&#xff0c;使用premake等来…

作者头像 李华
网站建设 2026/6/9 22:13:38

pytesseract 中英文 识别图片文字

要使用 pytesseract 识别图片文字,你需要先安装 Tesseract OCR引擎 和 Pillow库,然后通过几行 Python 代码导入库、加载图片,并调用 image_to_string() 函数进行识别,传入图片路径和指定语言 (如 ‘eng’ 或 ‘chi_sim’) 即可获得文本内容。 步骤 1: 安装 Tesseract OCR引…

作者头像 李华
网站建设 2026/6/9 22:13:11

20、文件搜索、压缩与归档操作指南

文件搜索、压缩与归档操作指南 1. 文件搜索技巧 在日常的文件管理中,我们常常需要搜索特定的文件。传统的方式可能会多次执行命令,效率较低。为了提高效率,我们可以采用以下两种方法。 1.1 利用 find 命令的新特性 将 find 命令结尾的分号 ; 替换为加号 + ,就能…

作者头像 李华