RustDesk 编译构建完全指南:本地 vcpkg 构建、各系统依赖配置与 Docker 构建
本文以 RustDesk 官方越南语 README(docs/README-VN.md)为主线,系统讲解如何从源码构建 RustDesk:包括 UI 运行时的依赖准备、基于 vcpkg 的 C 依赖安装、Ubuntu/Fedora/Arch 三种 Linux 发行版的编译环境搭建、Fedora 下 libvpx 的常见修复,以及基于仓库自带 Dockerfile 的容器化构建方案。读完后你可以独立完成 RustDesk 的源码编译,并理解其构建链中 vcpkg、build.rs 与 Cargo 特性之间的协作关系。
项目概览与构建对象
RustDesk 是一个用 Rust 编写的开源远程桌面软件,设计目标为可自托管(self-hosting),是 TeamViewer 的替代品:安装后即可使用,也可自建 rendezvous/relay 服务器以获得对数据的完全控制权。当前仓库的版本号定义为 1.4.9,最低 Rust 版本要求为 1.75,见 Cargo.toml:
[package]
name = "rustdesk"
version = "1.4.9"
rust-version = "1.75"
构建产物是一个主二进制 rustdesk(default-run = "rustdesk"),同时以 cdylib、staticlib、rlib 形式导出 librustdesk 库,供 Flutter 端(flutter/ 目录)通过 flutter_rust_bridge 调用。
UI 运行时与 C 依赖:Sciter/Flutter + vcpkg
RustDesk 桌面端有两套 UI:
- Flutter:现代方案,代码位于 flutter/ 目录(含
lib/、android/、ios/、windows/等平台工程); - Sciter:较旧的 HTML/CSS 方案(官方已标注 deprecated,但因启动简单仍被构建指南采用),UI 代码位于 src/ui/,其中
cm.rs、remote.rs为 Sciter 脚本入口,配套.html/.css/.tis资源文件。
无论哪套 UI,核心渲染与编解码都依赖一批 C/C++ 库,通过 vcpkg 安装。最小依赖集为四个:
# 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
仓库根目录的 vcpkg.json 描述了完整的依赖矩阵,比文档中的最小集更丰富,并带有平台门控(platform gating):
- 基础编解码:
libvpx(VP8/VP9)、libyuv(像素格式转换)、opus(音频)、aom(AV1); libjpeg-turbo:JPEG 编解码;libsodium:仅在windows & arm64平台引入;mfx-dispatch:Intel 硬件编解码(QSV),仅在 x86/x64 的 Android/Linux 或非 UWP Windows 上启用;ffmpeg:在静态构建(statictriplet)的 Windows/Linux 非 arm32/macOS 上启用,并按平台开启amf(AMD)、nvcodec(NVIDIA)、qsv(Intel)feature;cpu-features:仅 Android 平台。
此外,vcpkg.json 声明了两个关键目录:
"overlay-ports": ["./res/vcpkg"],
"overlay-triplets": ["./res/vcpkg-triplets"]
其中 res/vcpkg/ 存放 RustDesk 对上游 vcpkg 端口打了补丁的覆盖版本(包括 res/vcpkg/libvpx/、res/vcpkg/ffmpeg/ 等,ffmpeg 目录内含 20 余个修复补丁),res/vcpkg-triplets/ 存放 Android 各架构的自定义 triplet 配置(如 arm64-android.cmake、x64-android.cmake)。也就是说,实际构建时 vcpkg 会优先使用仓库内的定制端口,而不是社区 baseline 版本。
基本构建步骤
构建 RustDesk 需要同时具备 Rust 工具链和 C++ 编译环境,原因是 build.rs 会在编译期用 cc crate 直接编译平台相关的 C/C++ 源码:
- Windows:编译
src/platform/windows.cc并链接WtsApi32; - macOS:以
-std=c++17编译src/platform/macos.mm。
基本流程为:
- 准备 Rust 开发环境与 C++ 编译器(
g++/clang等); - 下载并安装
vcpkg,设置环境变量VCPKG_ROOT指向安装目录(vcpkg 构建系统通过它定位产物); - 按上文命令安装
libvpx libyuv opus aom; - 运行
cargo run。
如果只需最简的本地体验,按 docs/README-VN.md 的最小路径即可;若需要硬件编解码、VRAM 捕获、Wayland DRM 等能力,可通过 Cargo feature 开启(见 Cargo.toml):
hwcodec = ["scrap/hwcodec"] # 硬件编解码
vram = ["scrap/vram"] # VRAM 直接捕获
mediacodec = ["scrap/mediacodec"] # Android MediaCodec
drm = ["scrap/drm"] # Linux DRM/DRM-tap 捕获
flutter = ["flutter_rust_bridge"] # 启用 Flutter UI
这些 feature 最终映射到 libs/scrap/ 中的不同捕获/编码后端,例如 common/hwcodec.rs、common/vram.rs、common/mediacodec.rs、common/drm_reader.rs。
Linux 构建:逐发行版依赖清单
文档按三大发行版分别给出了系统级依赖,这些依赖对应屏幕捕获(X11/Wayland)、输入注入(xdo)、音频(ALSA/PulseAudio)等能力,可完整照抄执行。
Ubuntu 18 / Debian 10
sudo apt install -y 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
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
其中 nasm/yasm 是汇编器(libvpx、aom 需要),libgtk-3-dev/gtk3 支撑 Sciter UI 的 GTK 宿主库,libxdo 支撑键盘鼠标注入(对应 libs/enigo/ 的 Linux 实现,其底层调用 xdotool)。
安装并固定 vcpkg 版本
文档明确要求 checkout 到 2023.04.15 这个 tag,这与 Dockerfile 中的做法完全一致(git clone --branch 2023.04.15),说明该版本是与仓库内 res/vcpkg 覆盖补丁验证过的基线:
git clone https://github.com/microsoft/vcpkg
cd vcpkg
git checkout 2023.04.15
cd ..
vcpkg/bootstrap-vcpkg.sh
export VCPKG_ROOT=$HOME/vcpkg
vcpkg/vcpkg install libvpx libyuv opus aom
Fedora 下 libvpx 的 -fPIC 修复
Fedora 默认的 PIE(位置无关可执行文件)策略会导致 libvpx 的静态库缺少 PIC 代码而链接失败。文档给出的修复方式是手动进入 vcpkg 的构建目录,向 Makefile 注入 -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
这一步只对 Fedora 系(强制 PIE 的发行版)必要;Ubuntu/Debian 通常可直接完成 vcpkg install libvpx。
一键 Build 流程(Linux)
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
git clone https://github.com/rustdesk/rustdesk
cd rustdesk
mkdir -p target/debug
wget https://raw.githubusercontent.com/c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so
mv libsciter-gtk.so target/debug
VCPKG_ROOT=$HOME/vcpkg cargo run
要点解析:
libsciter-gtk.so需要手动下载并放到target/debug/,因为 Sciter 运行时不会随 cargo 分发(Windows 对应sciter.dll、macOS 对应libsciter.dylib,需按平台自行获取);VCPKG_ROOT必须在 cargo 命令时注入,build.rs 与链接脚本依据它找到installed/<triplet>/lib下的静态库。
Docker 构建:预编译好一切的一键容器
仓库根目录提供了 Dockerfile 与 entrypoint.sh,把上述所有系统依赖固化进镜像,适合快速构建或 CI。
镜像构建
git clone https://github.com/rustdesk/rustdesk
cd rustdesk
docker build -t "rustdesk-builder" .
从 Dockerfile 看,镜像基于 debian:bullseye-slim,内部完成了:
apt安装g++ gcc nasm yasm libgtk-3-dev clang libxcb-*-dev libasound2-dev libpulse-dev等(与上文 Ubuntu 清单同源,另加 GStreamer、libssl-dev);- 源码编译安装 CMake 3.30.6 到
/usr/local; - 克隆 vcpkg 2023.04.15 并执行
vcpkg install libvpx libyuv opus aom(VCPKG_FORCE_SYSTEM_BINARIES=1强制系统工具链); - 下载
libsciter-gtk.so到/home/user/; - 以非 root 用户
user安装 rustup 工具链。
运行构建
每次构建执行(挂载源码目录与 cargo 缓存卷):
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
entrypoint.sh 会解析传入参数:识别 --release 后自动把 libsciter-gtk.so 复制到 target/release/,支持 --target <triple> 动态 rustup target add,最终执行 VCPKG_ROOT=/vcpkg cargo build --locked。因此追加 --release 参数即可构建优化版本。
产物与注意事项(与文档一致):
- 首次构建较慢,依赖会进入
rustdesk-git-cache、rustdesk-registry-cache两个命名卷,之后构建显著变快; - 编译结果保存在宿主机的
target/目录,直接运行:
target/debug/rustdesk # debug 版
target/release/rustdesk # release 版
- 上述命令必须在 RustDesk 仓库根目录 下执行,否则应用找不到资源文件;
- 不支持通过该容器方式跑
cargo install/cargo run——它们会在容器内部安装或执行程序,而不是宿主机上。
仓库文件结构:构建产物如何对应源码模块
文档对仓库结构给出了权威说明,结合源码可以进一步定位各模块职责:
| 路径 | 职责 |
|---|---|
| libs/hbb_common | 公共库:视频编解码封装、配置、TCP/UDP wrapper、protobuf 定义、文件传输用 fs 函数及通用工具 |
| libs/scrap | 屏幕录制/捕获。src/common/ 下按后端划分(linux.rs、wayland.rs、quartz.rs、dxgi.rs、mediacodec.rs、hwcodec.rs 等),libs/scrap/examples/ 提供 screenshot.rs、record-screen.rs 等独立验证工具 |
| libs/enigo | 跨平台键鼠注入抽象,分 linux/、macos/、win/ 三套实现,libs/enigo/examples/ 有 mouse.rs、keyboard.rs 等示例 |
| src/ui | Sciter 用户界面:cm.rs(连接管理器)、remote.rs(远程会话)及其 .html/.css/.tis 脚本资源 |
| src/server | 被控端服务:audio_service.rs(音频)、clipboard_service.rs(剪贴板)、input_service.rs(输入)、display_service.rs/video_service.rs(视频)、connection.rs(网络连接管理) |
| src/client.rs | 发起与 peer 的连接 |
| src/rendezvous_mediator.rs | 与 rendezvous 服务器通信的中枢,RendezvousMediator 结构体定义于 src/rendezvous_mediator.rs#L102,负责等待直连(TCP hole punching)或中转(relay)建立 |
| src/platform | 各平台专属代码:windows.rs/windows.cc、macos.mm、linux.rs、delegate.rs(macOS 权限脚本见 src/platform/privileges_scripts/) |
| flutter | Flutter UI 桌面与移动端代码,lib/desktop/、lib/mobile/ 分平台组织 |
从源码结构看,一次典型远程会话的数据流大致是:libs/scrap 捕获屏幕帧 → src/server/display_service.rs 编码推送 → src/rendezvous_mediator.rs 完成打洞/中转握手 → src/client.rs 接收解码 → UI 层(Sciter 或 flutter)渲染,而 vcpkg 提供的 libvpx/aom/opus/libyuv 正是这条链路底层的编解码实现。
附:构建与打包相关脚本
除文档正文覆盖的内容外,仓库 res/ 目录还包含官方 CI 使用的构建脚本,供深入参考:
- res/ab.py:跨平台构建与 AppImage/deb/rpm 打包入口;
- res/strategies.py、res/devices.py、res/users.py:构建策略与元数据;
- res/vcpkg/ 与 res/vcpkg-triplets/:定制 vcpkg 端口与 Android triplet;
- appimage/AppImageBuilder-x86_64.yml:AppImage 打包配置。
小结
RustDesk 的构建体系可归纳为三层:系统层(各发行版清单 + Sciter 运行时)、C 依赖层(vcpkg 2023.04.15 + 仓库内 overlay 端口)、Rust 层(cargo run/cargo build,feature 决定能力集)。三种路径可任选其一并行验证:本地最小集(cargo run)、平台定制(Ubuntu/Fedora/Arch 清单 + vcpkg 修复)、Docker 容器(--release + 缓存卷)。按 docs/README-VN.md 的原始步骤配合本指南的源码定位,即可完成从克隆到可运行二进制的完整构建。
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 StartedRust0623
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