ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Ubuntu 20.04无人机开发环境搭建:PX4+ROS2+Gazebo+QGC实战指南

Ubuntu 20.04无人机开发环境搭建:PX4+ROS2+Gazebo+QGC实战指南 如果你正打算入无人机软件开发这行或者已经走到环境搭建这一步大概率会遇到一个尴尬情况算法原理看懂了代码也能读懂结果卡在 Ubuntu 20.04 上怎么把 PX4、ROS 2、Gazebo 仿真器和 QGroundControl 全部跑通这件事上。无人机软件开发环境最劝退的地方不在于某个工具多难装而在于整个工具链之间存在大量的版本依赖关系装错一个环节后面全盘卡住。这篇文章就把我在学习和实战中沉淀下来的环境搭建流程、Linux 工程基础知识和排查经验一次性说清楚适合正在自己搭建无人机软件开发环境的初学者也适合需要帮别人排坑的过来人。很多人以为环境搭不好是自己的问题实际上大多数情况下是信息差的问题官方文档默认你熟悉 Linux而教材默认你已经有环境两边的空档全靠自己填。我写这篇内容的目的就是把这一块空档补齐让你知道每一步为什么要这样做出问题时应该先怀疑什么而不是盲目重装系统。1. 为什么无人机软件开发绕不开 Ubuntu 20.041.1 从飞控固件到地面站整条工具链几乎都是 Linux 优先如果你只是玩成品无人机Windows 或 macOS 完全够用因为飞控内部的逻辑对你不可见。但无人机软件开发是另一回事。你面对的第一层是 PX4 或 ArduPilot 这类开源飞控固件它们提供的编译工具链、交叉编译脚本、仿真器接口全都是围绕 Linux 设计的。PX4 的官方文档明确推荐在 Ubuntu 上编译不是因为他们懒得做 Windows 支持而是大量底层脚本依赖 bash、make、cmake 和 Linux 的设备文件系统移植到 Windows 上的成本远超收益。第二层是 ROS / ROS 2。只要你想做机载计算机上的感知、规划、编队或者视觉避障ROS 2 几乎是绕不开的中间件。ROS 2 虽然现在也支持 Windows但主力开发和 CI 验证都在 Linux 上很多功能包在 Windows 上要么没有预编译包要么跑起来有一堆兼容问题。我可以直接说结论在无人机软件开发这个领域Linux 不是选择题而是必答题。第三层是MAVSDK、MAVLink 路由工具、日志分析工具。MAVSDK 提供 C 和 Python 的库QGroundControl 虽然有跨平台版本但如果你要改地面站源码或者跑自动化测试还是得回到 Linux。整套链路下来你基本没有理由不选一个 Linux 发行版作为开发主力机。1.2 为什么是 20.04而不是更新的 22.04 或 24.04这里有一个很多人问过我的问题Ubuntu 都出到 24.04 了为什么还抱着 20.04 不放我的回答是无人机软件开发的版本对齐习惯比追新更重要。Ubuntu 20.04 是 2020 年 4 月发布的 LTS 版本官方标准支持到 2025 年扩展支持可以到 2030 年。这个时间窗口覆盖了 PX4 从 1.11 到 1.15 的整个主力迭代周期。换句话说你在网上搜到的大多数教程、论坛帖子、课程视频默认环境都是 20.04。更关键的是 ROS 2 的版本匹配。ROS 2 Foxy Fitzroy 是官方指定支持 Ubuntu 20.04 的发行版而 PX4 的 ROS 2 接口文档里大量示例都是基于 Foxy 写的。如果你用 22.04对应的是 ROS 2 Humble用 24.04 对应的是 Jazzy。这些新版本不是不能用而是很多第三方功能包还没跟上遇到问题你连搜索都搜不到几条结果。我自己踩过一次很典型的坑在 22.04 上尝试编译 PX4 ROS 2 Humble 桥接折腾了三天最后发现是 Fast DDS 版本和某个依赖的兼容问题。换回 20.04 Foxy 之后半小时解决。新版本的工具链本身没有错但在无人机这个相对小众的领域生态的力量远大于版本的新旧。组件推荐版本对应关系说明操作系统Ubuntu 20.04.6 LTSPX4 官方 CI 主力验证环境ROS 2Foxy FitzroyEOL 到 2023 年但教程存量最大PX41.14.x / 1.15.x两个版本均原生支持 20.04GazeboGazebo 11PX4 默认仿真器Ubuntu 20.04 官方源自带QGroundControl最新稳定版AppImage 方式运行跨版本兼容2. 装机后的第一轮系统配置换源、显卡驱动与输入法系统装好只是第一步。我见过太多人直接在默认源下跑apt update结果下载速度以 KB 为单位装个依赖能等半小时。这一节的内容建议在安装任何开发工具之前完成能省下后续大量时间。2.1 换软件源格式和操作顺序Ubuntu 20.04 的软件源配置文件是/etc/apt/sources.list里面每一行对应一个软件仓库。默认指向的是archive.ubuntu.com在国内网络环境下速度很不稳定。换成国内镜像源是第一个必做操作。我习惯用清华源。先备份原文件再替换内容sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak sudo sed -i s//.*archive.ubuntu.com//mirrors.tuna.tsinghua.edu.cng /etc/apt/sources.list sudo sed -i s//security.ubuntu.com//mirrors.tuna.tsinghua.edu.cng /etc/apt/sources.list sudo apt update如果你不想用 sed也可以直接编辑文件把archive.ubuntu.com和security.ubuntu.com都替换成mirrors.tuna.tsinghua.edu.cn。替换完之后执行sudo apt update如果输出里没有报错说明源配置成功。需要注意一个常见问题如果执行apt update时出现The repository ... does not have a Release file的报错多半是源列表里混入了其他版本比如 bionic 或 jammy的条目。20.04 的版本代号是 focal所有仓库路径里都应该是 focal、focal-updates、focal-security、focal-backports 中的一种。检查一下有没有混入不匹配的条目即可。还有一个小技巧建议顺手安装software-properties-common和curl后面加 PPA 和下载安装脚本会经常用到。sudo apt install -y software-properties-common curl wget git vim2.2 显卡驱动与 OpenGLGazebo 闪退的隐形元凶无人机仿真里用到的最重图形应用就是 Gazebo它依赖 OpenGL 硬件加速。如果你用的是 NVIDIA 显卡却停留在系统自带的 nouveau 开源驱动上Gazebo 的表现会非常差甚至直接闪退。安装 NVIDIA 驱动最简单的方式sudo ubuntu-drivers autoinstall sudo rebootubuntu-drivers autoinstall会自动检测显卡型号并安装推荐版本。装完重启后用nvidia-smi验证驱动是否生效。如果nvidia-smi输出正常说明驱动到位。这一步之所以要紧是因为很多人在 Gazebo 崩溃后反复重装最后才发现是显卡驱动的问题。值得一提的是如果你是笔记本电脑且同时有核显和独显Ubuntu 默认的 PRIME 切换机制通常能自动处理不需要额外配置。2.3 输入法与终端工具的取舍开发环境里的中文输入法我的建议是如果你主要用图形界面装 fcitx5 就好如果主要远程 SSH 或只在终端里工作可以不装输入法省得跟 IDE 的快捷键冲突。相比在 Ubuntu 20.04 上折腾搜狗输入法可能遇到的候选框不跟随、升级后崩溃等问题fcitx5 整体更省心sudo apt install -y fcitx5 fcitx5-chinese-addons装完后在设置-区域与语言-输入源里添加拼音并把系统输入法框架切到 fcitx5注销重新登录即可。终端方面我推荐 Terminator不是因为它功能多而是它支持在同一个窗口里分屏编译时一边看日志一边查资料的体验差距很大。3. Linux 工程基础三件套Shell、权限与可执行文件无人机软件开发本质上是在 Linux 上做嵌入式软件开发所以 Linux 工程基础决定了你后面调试代码的效率。这一节不讲大而全的 Linux 教程只讲三个最容易卡住无人机开发者的关键点。3.1 Shell 操作的当前目录思维初学阶段最常见的错误之一是找不到文件。这往往不是文件不存在而是 Shell 的当前工作目录和你以为的目录不一样。Shell 里的所有相对路径都是相对于当前目录而言的。你在终端里敲命令时始终要清楚自己在哪里。我建议把这两个命令变成肌肉记忆pwd # 显示当前目录 ls -la # 列出当前目录下所有文件包括隐藏文件PX4 的编译脚本在设计上默认你在固件根目录下执行make如果你切到了build目录里再执行CMake 会报各种莫名其妙的错误。很多编译失败其实是目录不对造成的先pwd看一眼能省掉大量排查时间。另外终端里的 Tab 补全不是给懒人准备的它是避免路径拼写错误最有效的工具。打几个字母按 TabShell 帮你补全路径如果有多个匹配项连按两次 Tab 会列出所有候选。路径里有空格的情况下Tab 补全还能自动帮你加转义符这比手动敲可靠得多。3.2 权限模型为什么总是 Permission deniedLinux 对文件权限的管理可以简单概括为三组三类文件所有者u、文件所属组g、其他人o每组有读r、写w、执行x三个权限位。用ls -l看到的-rwxr-xr-x这类字符串就对应这些权限的排列。第一次接触chmod时很多新手喜欢用sudo chmod 777 -R /path一把梭这种操作在个人学习机上问题不大但在工程环境里是很差的做法。777 意味着所有人都可以读写执行一旦目录里有敏感脚本或者关键配置权限过度放开等于埋雷。我更建议按需授权chmod x script.sh # 添加执行权限 chmod 755 /path/to/dir # 所有者可读写执行组和其他用户可读可执行PX4 安装脚本或者二进制工具经常需要chmod x写 Go 或 Python 脚本时如果遇到Permission denied优先检查执行权限而不是怀疑代码写错了。也有一个反向的坑sudo权限不是万能的。有些下载下来的脚本默认用当前用户执行如果你习惯了一上来就sudo bash xxx.sh脚本内部创建的文件所有者会是 root后续再用普通用户编译时会遇到无法写入的问题。我的经验是安装类脚本按文档建议用普通用户执行只有明确需要 root 权限的命令才加 sudo。3.3 PATH 与环境变量command not found 的真相当你敲了gazebo却提示command not found不一定是你没装软件也可能是 Shell 根本不知道去哪里找可执行文件。Linux 查找命令是通过 PATH 环境变量完成的。你可以这样查看echo $PATH输出是一长串用冒号分隔的目录。Shell 会从左到右在这些目录里寻找匹配的可执行文件。常见的/usr/local/bin、/usr/bin、/bin都在其中。你自行安装到/opt或~/bin下的工具如果这些路径不在 PATH 里就必须用完整路径执行。想永久添加路径需要修改~/.bashrcecho export PATH$PATH:$HOME/bin ~/.bashrc source ~/.bashrcsource ~/.bashrc的作用是让当前终端重新加载配置文件不需要新开窗口。很多新手改完.bashrc后抱怨没生效其实只是没执行source。有一个容易混淆的点.bashrc只对当前用户的交互式 Shell 生效而开机自启动的服务脚本通常不加载它它们读的是/etc/profile或 systemd 的 service 文件。所以如果你写了一个开机自启动的脚本千万不要依赖.bashrc里的变量否则服务起不来还找不到原因。4. 搭建 PX4 与 ROS 2 共存的环境版本对齐是关键4.1 前置工具包把编译链一次性装齐在装 PX4 之前先把基础工具链装好。除了前面提到的 git、curl、vim 之外还需要构建工具和 Python 环境sudo apt install -y build-essential cmake ninja-build python3 python3-pip python3 -m pip install --upgrade pipbuild-essential包含 gcc、g、make 等核心工具CMake 用来生成构建文件Ninja 是更快的编译调度器Python 环境用于运行 PX4 的很多辅助脚本。这里有个关于 Python 的细节Ubuntu 20.04 自带的 Python 是 3.8PYTHON 3.8 对于 PX4 1.14/1.15 和 MAVSDK 来说完全够用不建议手痒去升级系统默认 Python 版本也不要轻易切换python3的软链接指向。很多 PX4 编译问题都源于系统 Python 环境被改装过导致 CMake 找不到正确的解释器。如果你需要新版本 Python用apt安装或在虚拟环境里使用不要动系统级版本。4.2 PX4 固件源码的克隆与编译PX4 的源码托管在 GitHub包名是 PX4-Autopilot。注意一定要用--recursive参数克隆因为项目里有大量子模块没有这个参数会导致后面编译时缺东西cd ~ git clone --recursive https://github.com/PX4/PX4-Autopilot.git cd PX4-Autopilot官方推荐跑一次环境脚本它会安装编译 PX4 所需的全部依赖包括交叉编译工具链和仿真器依赖。整个过程比较耗时建议保持网络畅通并耐心等待bash ./Tools/setup/ubuntu.sh脚本跑完后启动 Gazebo 仿真make px4_sitl gazebo这个命令会做三件事配置 CMake 构建、编译 PX4 固件、启动 Gazebo 加载无人机模型。第一次编译需要下载依赖并编译大量代码时长从 20 分钟到 1 小时不等取决于机器性能。看到 Gazebo 界面里出现一架多旋翼无人机且终端输出[px4] Creating new log file之类的内容说明环境已经跑通了。PX4-Autopilot 的目录结构值得花十分钟熟悉一下src目录存放核心模块源码ROMFS存放固件启动脚本和默认参数build目录存放编译产物Tools里是官方维护的辅助脚本。后面写自定义模块或修改参数时你会频繁穿梭于这些目录之间。4.3 ROS 2 Foxy 的安装与 PX4 桥接ROS 2 Foxy 的安装命令官方文档写得很清楚这里记录一下关键顺序。先设置软件源再安装核心包sudo apt install -y software-properties-common sudo add-apt-repository universe sudo apt update sudo apt install -y ros-foxy-desktop python3-argcomplete sudo apt install -y python3-colcon-common-extensions安装完成后每次开新终端都需要source /opt/ros/foxy/setup.bash才能使用 ROS 2 命令。为了省事可以把它追加到~/.bashrc。PX4 与 ROS 2 通信的标准方式是 uXRCE-DDSMicro XRCE-DDSPX4 端运行 MicroXRCEAgentROS 2 端通过px4_ros_com包实现消息接口。你需要把px4_ros_com克隆到 ROS 2 的工作空间里编译mkdir -p ~/ws_px4/src cd ~/ws_px4/src git clone --recursive https://github.com/PX4/px4_ros_com.git cd ~/ws_px4 colcon build之后先启动 MicroXRCEAgent再启动 Gazebo 仿真两者连接成功后才能用ros2 topic list看到飞控发出的消息。版式对应关系特别重要。如果你在 20.04 上装的是 ROS 2 Foxy那就必须用兼容 Foxy 的px4_ros_com分支或主分支如果你跨版本混用会出现消息类型不匹配、编译报错等一堆问题。建议遇到问题先确认彼此的版本再去看具体的代码报错。4.4 MAVSDK 与 QGroundControl补全地面站侧能力PX4 和 ROS 2 搞定了机载计算地面站侧还需要 QGroundControl 做飞行监控和参数调整。QGroundControl 以 AppImage 方式分发下载后chmod x QGroundControl.AppImage ./QGroundControl.AppImage如果启动时报缺少libfuse2在 20.04 上手动装一下即可。AppImage 的好处是不需要 root 权限、不污染系统目录缺点是启动速度稍慢但对地面站来说完全可以接受。MAVSDK 提供了用代码控制无人机的能力。Python 版安装最简单pip install mavsdkMAVSDK 走的是 MAVLink 协议可以连接 QGroundControl 或 PX4 的 SITL 仿真器。很多刚入门做任务飞行的开发者用 MAVSDK 写航线程序比直接改 PX4 模块快得多。到这里你的开发环境已经集齐了四件套PX4 仿真器、ROS 2 桥接、QGroundControl 地面站、MAVSDK 开发库。接下来最需要关注的是如何排查环境中的各种怪问题。5. 编译过程踩过的坑从依赖到仿真的完整排查链路5.1 编译还没开始先检查磁盘和内存PX4 的完整编译产物在 10GB 量级ROS 2 工作空间再加几个功能包磁盘占用会轻松超过 20GB。如果分区空间不足编译到一半就会报No space left on device而且这种错误不好定位因为你可能只看到 g 的报错信息。开始编译前先看两个指标df -h free -hdf -h看磁盘剩余空间free -h看内存和交换分区。如果内存低于 8GB编译时建议增加 swap避免出现g: internal compiler error: Killed——这个报错几乎都是内存不足导致编译器进程被系统杀掉。给 Ubuntu 加 swap 的方法并不复杂sudo fallocate -l 8G /swapfile sudo chmod 600 /swapfile sudo mkswap /swapfile sudo swapon /swapfile如果你想永久生效需要在/etc/fstab里加一行/swapfile none swap sw 0 0。我自己在内存只有 8GB 的老笔记本上加了 8GB swap 后编译 PX4 再也没崩过。5.2 Gazebo 启动失败的三步排查法Gazebo 环境的坑比 PX4 本身多得多。如果你执行make px4_sitl gazebo后界面卡住、闪退或者黑屏不要急着重装按这个顺序排查。第一步单独启动 Gazebo 看报错gazebo --verbose直接跑 Gazebo 而不经过 PX4 的启动脚本能判断问题出在哪一层。如果 Gazebo 本身报错说明是 Gazebo 环境或显卡驱动问题如果 Gazebo 正常但 PX4 一启动就退出说明是模型或通信问题。第二步检查模型库。Gazebo 启动时会去加载~/.gazebo/models下的模型文件。如果你看到的场景里地面是空的、没有无人机模型大概率是模型库下载不完整。PX4 的模型文件在固件仓库的Tools/sitl_gazebo子模块里检查子模块是否完整下载cd ~/PX4-Autopilot git submodule update --init --recursive第三步检查 OpenGL 相关报错。终端里出现libGL error: failed to load driver: swrast时基本可以断定是显卡驱动或 Mesa 库不匹配。回到第 2.2 节把显卡驱动装好或者安装libgl1-mesa-dri和mesa-utils等基础 Mesa 包这个问题通常能解决。5.3 源码路径与 root 用户禁忌PX4 官方文档里有一句话让我印象很深不要把源码放在/root下也不要放到带空格或中文的路径里。很多人不以为意直到踩了坑才明白原因。在 root 用户下编译 PX4脚本会用 root 创建一堆编译产物之后切回普通用户编译时会遇到权限冲突更麻烦的是Gazebo 会拒绝以 root 权限运行因为安全限制导致仿真器起不来。路径里有空格的话CMake 的解析常常会出错尤其是 Gazebo 模型文件里的 URI 路径。所以源码目录的规范是使用纯英文、无空格的绝对路径最好放在/home/用户名/下。如果你的编译环境已经乱到不可收拾不要花大量时间去逐个修复依赖。我的习惯是把build目录删掉重新编译或者干脆把PX4-Autopilot目录删掉重新克隆。PX4 的编译系统设计得还算干净重新来一次的成本通常低于排查脏环境的成本。6. 从仿真到真机地面站、MAVLink 与设备权限6.1 MAVLink 消息流飞控与地面站之间在说什么PX4、QGroundControl、MAVSDK 三者之间的通信都基于 MAVLink 协议。MAVLink 是一种轻量级的消息协议以消息 ID 区分不同类型的报文。飞控会持续向地面站发送心跳包HEARTBEAT、姿态信息ATTITUDE、GPS 位置GLOBAL_POSITION_INT等消息地面站下发解锁、起飞、航线指令。理解这个协议的作用是当你在 QGroundControl 上看不到飞控状态时问题通常出在通信链路而非飞控本身。仿真模式下PX4 通过 UDP 端口 14550 向地面站发数据真机模式下PX4 通过 USB 串口通常识别为/dev/ttyACM0输出 MAVLink 消息。如果你需要让多个程序同时读飞控数据比如 QGroundControl 和 ROS 2 同时运行单纯打开两个串口连接会冲突。这时可以用mavlink-router做数据分发把一个串口的 MAVLink 流量路由到多个 UDP/TCP 终端。这个工具在配套 PX4 使用时非常实用是进阶阶段绕不开的组件。6.2 USB 设备权限别用 chmod 777 糊弄了事真机调试时把 Pixhawk 通过 USB 连到电脑上系统会识别出一个串口设备/dev/ttyACM0。直接用 QGroundControl 连接时如果提示无法打开串口十有八九是当前用户没有这个设备的访问权限。很多教程会教你sudo chmod 777 /dev/ttyACM0这种操作在当前终端有效但重新插拔设备后权限会被重置治标不治本。正确做法是添加 udev 规则让系统在设备插入时自动赋予 dialout 用户组访问权限。先把自己的用户加入dialout组sudo usermod -a -G dialout $USER然后创建 udev 规则文件echo SUBSYSTEMtty, ATTRS{idVendor}26ac, ATTRS{idProduct}0011, MODE0660, GROUPdialout | sudo tee /etc/udev/rules.d/99-pixhawk.rules sudo udevadm control --reload-rules这里面的26ac和0011是 Pixhawk 系列常见的 USB Vendor ID 和 Product ID。不同飞控硬件的 ID 可能不同可以用lsusb查看设备信息后填入自己的值。添加完规则后重新插拔 USB 线再运行ls -l /dev/ttyACM*确认设备权限已经正常。这个流程比chmod 777多花两分钟但对工程素养的养成非常有价值。6.3 真机联调的安全检查清单从仿真切换到真机第一原则是安全。以下是我在实际带着新手做真机联调时用的最小检查清单室内测试先拆掉螺旋桨或者使用不带桨的测试台架固定机身确保电池电压充足低电量不仅影响飞行时间还会导致飞控重启首次连接 QGroundControl 后先检查固件版本、传感器校准状态再尝试解锁电机解锁前远离螺旋桨平面即使带着桨也默认它是会转的日志文件在飞控的 SD 卡/log目录下每次飞行结束后导出日志用于分析。真机联调最常见的场景是GPS 搜不到星或磁罗盘干扰。这两种问题的处理思路完全不同前者的关键在硬件天线位置和环境遮挡后者通常是飞控周围有电流或铁磁材料干扰。在 QGroundControl 里查看传感器状态页能快速定位是哪一类问题。7. 工程习惯无人机软件入门阶段最值得养成的几件事7.1 用目录和版本管理守住自己的工作区环境搭好之后随着你不断学习工作区会越来越乱。PX4 固件源码、自己的 ROS 2 功能包、实验脚本、日志文件全部堆在一起总有一天会互相干扰。我的习惯是建立清晰的项目结构例如~/uav_dev/ ├─ firmware/PX4-Autopilot # 飞控固件只读为主 ├─ workspace/ros2_ws # ROS 2 工作空间 ├─ scripts/ # 自己的工具脚本 └─ logs/ # 仿真和真机日志PX4 固件源码用 Git 管理但不要在固件仓库里直接改代码。如果你要修改内部逻辑先创建自己的分支或者把你的变更维护成 patch 重新打补丁否则一次git pull可能把你的改动冲得干干净净。ROS 2 工作空间里的每个功能包都应该单独处于 Git 仓库中或者至少用.gitignore把build、log、install目录排除掉——这些目录里全是编译产物放进去只会让仓库膨胀。7.2 用系统快照给自己留一条退路Linux 上有很多方法把系统搞坏尤其是在折腾环境的时候。改错一个驱动配置、误删一个系统库文件都可能导致图形界面无法启动这很耗时。我强烈建议在装好环境、完成第一次全功能跑通之后立刻用 Timeshift 做一次系统快照。Timeshift 类似 Windows 的系统还原点能把你整个系统恢复到某个时间点的状态。它的使用逻辑是sudo apt install timeshift sudo timeshift --create --comments after uav env setup如果后续把系统搞坏了启动时从 U 盘进入恢复模式用 Timeshift 回滚到快照时刻即可。我见过不少开发者因为一个小配置错误被迫重装系统重装完又要重新弄显卡驱动、软件源、开发工具白白浪费一整天。花钱花时间买教训不如提前十分钟做快照。7.3 日志先行的调试思维无人机软件开发和普通 Web 开发的一大不同是很多错误不是当场崩溃而是表现为飞行姿态异常、指令没有执行、通信中断。这时候靠眼睛看是看不出问题的必须依赖日志。PX4 在每次仿真运行和真机飞行后都会生成.ulg格式的日志文件里面记录了飞控收到的所有消息和状态变化。用 Flight Review 或 QGroundControl 自带的日志分析工具打开能看到每个时刻的姿态、转速、模式切换记录。真正上手之后你会发现排查问题最有效的方式不是改代码试错而是先看日志里在哪一秒发生了什么异常。从一开始就养成bug 出现先导出日志的习惯后面学习效率会高很多。很多看似玄学的问题日志里都写了答案只是你还没学过怎么读。说到底搭建无人机软件开发环境这件事本质上是学习如何在一个庞大而成熟的 Linux 生态里找到属于自己项目的每一种工具并把它们衔接起来。20.04 这套组合拳打好了再往后的很多开发问题都会顺理成章地解决。如果这篇文章能让你少经历一次重装系统或者少熬一个通宵那它的价值就算到位了。
返回列表