RustDesk 源码构建实战:vcpkg 依赖准备、Linux 编译流程与 Docker 构建详解
本文基于 RustDesk 仓库中的官方构建文档 docs/README-ID.md 及其对应的英文主文档 README.md 展开,系统讲解 RustDesk 桌面版从源码构建的完整链路:GUI 运行时与 vcpkg 四大核心编解码依赖(libvpx、libyuv、opus、aom)、Ubuntu/Fedora/Arch 三类发行版下的编译环境准备、Docker 容器化构建方案,以及 libs/、src/ 目录的代码结构脉络。读完本文,你可以独立在本地或容器内完成 RustDesk 的 debug/release 构建并定位关键源码模块。
项目背景与文档定位
RustDesk 是一个用 Rust 编写的开源远程桌面程序,面向自托管(self-hosting)场景,定位为 TeamViewer 的替代方案。其核心卖点(见 README.md 与 docs/README-ID.md):
- 开箱即用,无需额外配置即可连接;
- 数据完全由自己掌控,可自建 rendezvous/relay(会合/中继)服务器,也可使用官方服务器或自行编写会合/中继服务;
- 桌面端 GUI 使用 Sciter 或 Flutter 实现,跨 Windows / Linux / macOS,并有 Android / iOS / Web 端。
本仓库的构建文档(英文 README.md、印尼语 docs/README-ID.md 等 20+ 语言版本)同时承担着两个角色:一是用户下载预编译二进制之外的源码构建教程,二是贡献者进入代码库前的结构导览。下文所有命令与配置均以当前仓库(rustdesk crate 版本 1.4.9,Rust 1.75+,见 Cargo.toml)实际内容为准。
构建依赖:GUI 运行时与 vcpkg 四大核心库
GUI 运行时:Sciter 或 Flutter
桌面版的图形界面有两种技术路线(docs/README-ID.md “Dependensi” 一节):
- Sciter:传统 GUI 方案,实现位于
src/ui/(Sciter 模板 + Rust 脚本绑定)。英文 README.md 补充说明该方案已被标记为 deprecated,官方教程仍以 Sciter 为准,因为上手更简单; - Flutter:当前桌面与移动端共用的 UI 框架,Dart 代码位于 flutter/ 目录,Rust 侧通过
flutter_rust_bridge桥接(Cargo.toml 中的flutterfeature)。
若走 Sciter 路线,需要自行下载 Sciter 动态库并按平台放置(文档给出的下载源为 c-smile/sciter-sdk 官方发行件):
| 平台 | 动态库文件 | 放置位置(Linux 构建流程中) |
|---|---|---|
| Windows | sciter.dll |
可执行文件同目录 |
| Linux | libsciter-gtk.so |
target/debug/(见下文 Build 步骤) |
| macOS | libsciter.dylib |
可执行文件同目录 |
vcpkg:音频与视频编解码依赖
C/C++ 依赖统一通过 Microsoft vcpkg 管理,文档要求安装 vcpkg 并正确设置环境变量 VCPKG_ROOT。核心依赖是四个编解码库,按平台分别安装(Windows 需静态链接 triplet):
# Windows
vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static
# Linux / macOS
vcpkg install libvpx libyuv opus aom
四个库在 RustDesk 中的分工可以从源码结构对应上:libvpx/aom 是 VP8/VP9 与 AV1 视频编码器(libs/scrap 的屏幕采集编码路径),libyuv 负责帧格式转换,opus 负责音频编码(src/server/audio_service.rs 使用)。
当前仓库根目录的 vcpkg manifest vcpkg.json 还声明了更完整的依赖集,说明实际 CI/移动端构建比“最小四件套”更多:
libjpeg-turbo、libsodium(Windows ARM64);mfx-dispatch与带amf/nvcodec/qsvfeature 的ffmpeg,用于 x86/x64 平台的硬件编解码(对应 Cargo.toml 中hwcodec、vram、mediacodec等 feature 门控);vcpkg-configuration中通过overlay-ports: ./res/vcpkg与overlay-triplets: ./res/vcpkg-triplets引用了仓库自带的定制端口与 Android triplet(res/vcpkg-triplets/下含arm-neon-android.cmake、arm64-android.cmake等),这解释了 res/vcpkg/ 下大量针对 aom/ffmpeg/libvpx 的补丁文件。
最小启动步骤
环境(Rust 工具链 + C++ 编译环境 + vcpkg)就绪后,文档给出的最小路径只有一条命令:
cargo run
Linux 下的完整构建流程
文档按发行版给出了系统包清单,全部保留如下,可直接复制执行。
1. 安装系统依赖
Ubuntu 18 / Debian 10:
sudo apt install -y zip g++ gcc git curl wget nasm yasm libgtk-3-dev clang libxcb-randr0-dev libxdo-dev \
libxfixes-dev libxcb-shape0-dev libxcb-xfixes0-dev libasound2-dev libpulse-dev cmake make \
libclang-dev ninja-build libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
Fedora 28 / CentOS 8:
sudo yum -y install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libxdo-devel libXfixes-devel pulseaudio-libs-devel cmake alsa-lib-devel
Arch / Manjaro:
sudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire
从包清单可以读出构建环境的硬性要求:clang(Rust FFI 绑定如 libxdo-sys 需要 Clang 解析系统头文件)、libgtk-3-dev(Linux 桌面窗口与 Sciter 集成)、libxdo-dev/xdotool(键鼠控制,对应 libs/enigo 的 Linux 实现)、libasound2-dev/libpulse-dev(音频服务)、nasm/yasm(aom/libvpx 汇编构建)、libgstreamer1.0-dev(屏幕/音频采集管线)。
2. 安装并配置 vcpkg
# 从 Microsoft 官方仓库克隆 vcpkg(微软 vcpkg 项目)
git clone <vcpkg 官方仓库地址> vcpkg
cd vcpkg
git checkout 2023.04.15 # 文档固定版本基线,与 Dockerfile 中一致
cd ..
vcpkg/bootstrap-vcpkg.sh
export VCPKG_ROOT=$HOME/vcpkg
vcpkg/vcpkg install libvpx libyuv opus aom
git checkout 2023.04.15 不是可选项:Docker 构建文件 Dockerfile 中同样固定了 --branch 2023.04.15,保证宿主机手工构建与容器构建使用同一份端口定义,避免端口升级导致编译失败。
3. Fedora 下 libvpx 的 -fPIC 修复
文档给出了 Fedora 特有的手工修复步骤(vcpkg 构建的 libvpx 静态库缺 -fPIC 导致链接失败时):
cd vcpkg/buildtrees/libvpx/src
cd *
./configure
sed -i 's/CFLAGS+=-I/CFLAGS+=-fPIC -I/g' Makefile
sed -i 's/CXXFLAGS+=-I/CXXFLAGS+=-fPIC -I/g' Makefile
make
cp libvpx.a $HOME/vcpkg/installed/x64-linux/lib/
cd
即:重新 configure 后向 CFLAGS/CXXFLAGS 注入 -fPIC,手工编译并把手工产物 libvpx.a 覆盖回 vcpkg 的 installed/x64-linux/lib/ 目录。
4. 克隆仓库、放置 Sciter 库并构建
# 使用 rustup 安装 Rust 工具链(rustup 官方安装脚本)
curl --proto '=https' --tlsv1.2 -sSf <rustup 安装脚本地址> | sh
source $HOME/.cargo/env
git clone https://gitcode.com/GitHub_Trending/ru/rustdesk
cd rustdesk
mkdir -p target/debug
# 从 Sciter SDK 下载 Linux 动态库
wget <sciter-sdk 的 libsciter-gtk.so 发行地址>
mv libsciter-gtk.so target/debug
VCPKG_ROOT=$HOME/vcpkg cargo run
两个容易踩坑的细节:
libsciter-gtk.so必须提前放进target/debug/——Sciter 库不是 crate 依赖,而是运行时由进程加载的动态库,Cargo 不会替你处理,因此文档用mkdir -p+mv显式放置;libs/hbb_common是 git 子模块(仓库根.gitmodules指向rustdesk/hbb_common仓库),英文 README.md 的 Docker 章节因此要求克隆时加--recurse-submodules或克隆后执行git submodule update --init --recursive,否则hbb_common目录为空、cargo run会因找不到路径依赖而失败。
cargo run 会构建 Cargo.toml 中声明的 default-run = "rustdesk" 主程序(另含 naming、service 两个辅助 bin)。
Docker 方式构建
Docker 方案把整套 Linux 环境固化进镜像,宿主只需 Docker。流程分两步:
第一步:构建构建镜像
git clone https://gitcode.com/GitHub_Trending/ru/rustdesk
cd rustdesk
docker build -t "rustdesk-builder" .
第二步:挂载源码执行构建
docker run --rm -it -v $PWD:/home/user/rustdesk -v rustdesk-git-cache:/home/user/.cargo/git -v rustdesk-registry-cache:/home/user/.cargo/registry -e PUID="$(id -u)" -e PGID="$(id -g)" rustdesk-builder
命令参数逐项解释:
-v $PWD:/home/user/rustdesk:把宿主仓库目录挂到容器内工作目录(/home/user/rustdesk);-v rustdesk-git-cache:...、-v rustdesk-registry-cache:...:两个命名卷缓存 cargo 的 git 依赖与 registry 依赖,首次构建慢、后续构建快的关键;-e PUID/PGID:注入宿主用户 ID,使容器内生成的target/文件属主与宿主一致,避免后续 sudo 改属主。
结合 Dockerfile 与 entrypoint.sh 看构建细节
对照 Dockerfile 可以验证镜像内容与文档声明完全一致:
- 基础镜像
debian:bullseye-slim,安装与 Ubuntu 清单同源的编译依赖(libgtk-3-dev、libxdo-dev、libpulse-dev、libgstreamer1.0-dev等,见 Dockerfile); - 源码编译 CMake 3.30.6(Dockerfile);
- 固定 vcpkg
2023.04.15并预装libvpx libyuv opus aom,同时设置VCPKG_FORCE_SYSTEM_BINARIES=1(Dockerfile); - 预下载
libsciter-gtk.so到/home/user(Dockerfile); - 创建非 root 用户
user(uid 1000),与docker run时注入的PUID/PGID配合。
入口脚本 entrypoint.sh 负责真正的构建,其逻辑值得逐行看(entrypoint.sh):
- 遍历
docker run追加的参数:遇到--release时置标志位并把libsciter-gtk.so复制到target/release/;遇到--target <triple>时调用rustup target add(即文档所说的“在<OPTIONAL-ARGS>位置追加参数”); - debug 构建则把 Sciter 库复制到
target/debug/; - 最终以
VCPKG_ROOT=/vcpkg cargo build --locked $argv收尾——--locked保证按 Cargo.lock 精确复现依赖版本。
因此文档中“追加 --release 构建优化版”的用法,实际生效链路是:docker run ... rustdesk-builder --release → entrypoint 复制动态库到 target/release/ → cargo build --locked --release。构建产物直接落在宿主机(因为源码目录被挂载):
target/debug/rustdesk # debug 构建
target/release/rustdesk # release 构建
两点使用限制(文档明确提示,源码同样印证):
- 必须从 RustDesk 仓库根目录运行,否则应用找不到所需资源(如
res/下的图标、语言文件); - 容器方式下
cargo install、cargo run等子命令不可用——程序会在容器内而非宿主机安装/运行,entrypoint 也只会透传给cargo build。
此外 release profile 在 Cargo.toml 中开启了 lto = true、codegen-units = 1、panic = 'abort'、strip = true,所以 release 构建耗时长但产物小且紧凑,这也解释了“首次构建慢”的官方提示。
仓库代码结构导览
文档 “File Structure” 一节是理解 RustDesk 代码组织的入口,结合 Cargo.toml 的 workspace 成员声明(libs/scrap、libs/hbb_common、libs/enigo、libs/clipboard、libs/virtual_display、libs/portable、libs/remote_printer)可还原如下结构:
| 路径 | 职责 |
|---|---|
| libs/hbb_common | 公共基础设施:视频 codec 封装、配置读写、tcp/udp wrapper、protobuf 协议定义、文件传输用的 fs 函数等(git 子模块) |
| libs/scrap | 屏幕采集(screen capture),按平台分为 x11/wayland/quartz/dxgi 等后端,支持 hwcodec、vram、drm 等 feature |
| libs/enigo | 平台相关的键盘/鼠标控制(Linux 基于 xdo/nix,macOS/Windows 各自实现) |
| libs/clipboard | 跨平台(Windows/Linux/macOS)剪贴板与文件复制粘贴实现 |
| src/ui | 已弃用的 Sciter GUI(HTML/TIS 模板 + Rust 绑定,如 cm.html、remote.html) |
| src/server | 服务端五大服务:audio/clipboard/input/video service、显示服务与网络连接管理(service.rs、video_service.rs 等) |
| src/client.rs | 发起对被端(peer)的连接 |
| src/rendezvous_mediator.rs | 与 rustdesk-server(会合/中继服务器)通信,等待直连(TCP 打洞)或中继连接建立 |
| src/platform | 平台特有代码(windows/macos/linux 子目录,含权限脚本、特权提升等) |
| flutter | 桌面与移动端的 Flutter UI(Dart 代码 + 各平台壳工程,见 flutter/pubspec.yaml) |
补充两个与本文档语言版本相关的细节:UI 多语言由 src/lang/ 下的逐语言文件维护(印尼语对应 src/lang/id.rs),docs/README-ID.md 顶部的翻译招募说明即指向这些文件;src/server/ 中还包含文档未展开的终端服务(terminal_service.rs)等较新模块,结构清单可视为“主干导览”而非全量清单。
小结:构建路径选择
- 只想快速跑起来:按“最小启动步骤”装好 Rust + C++ 环境 + vcpkg 四件套,
cargo run; - 宿主机环境脏、不想污染系统:优先 Docker 方案,镜像已固化 vcpkg
2023.04.15、CMake 3.30.6 与 Sciter 动态库,配合 cargo 缓存卷实现增量快速构建; - 需要深入修改:先读
libs/hbb_common(协议与配置)、libs/scrap(采集编码)、src/rendezvous_mediator.rs(连接建立)三条主线,再进入src/server各服务。
参考文档与源码入口:docs/README-ID.md、README.md、Dockerfile、entrypoint.sh、vcpkg.json、Cargo.toml。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0624
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00