RustDesk 从源码构建完全指南:vcpkg 依赖、Linux 发行版适配与 Docker 构建
本篇以 RustDesk 仓库的构建文档(docs/README-UA.md 及其对应主文档 README.md)为核心,系统讲解如何从零构建 RustDesk:包括 Sciter/Flutter 图形界面依赖、vcpkg 媒体库依赖的安装与版本锁定、四大 Linux 发行版的构建环境准备、Fedora 下 libvpx 的 fPIC 修复,以及基于 Docker 的可复现构建流程。读完后你将掌握在任意主流 Linux 发行版上独立编译运行 RustDesk 的完整能力,并能深入理解仓库各核心模块(视频编码、屏幕捕获、输入模拟、P2P 信令)的源码位置与职责。
一、项目定位与构建前提
RustDesk 是一个用 Rust 编写的开源远程桌面应用,主打自托管场景:开箱即用、无需任何配置即可工作,数据完全由用户自己控制。你可以使用官方公共服务器,也可以搭建自己的中继/信令(rendezvous/relay)服务器,甚至自行实现一套。
桌面版 RustDesk 的图形界面有两套实现:
- Sciter(已弃用但更简单):文档给出的构建教程即针对 Sciter,因为它对新手更友好、更简单;
- Flutter(当前主力):桌面与移动端均使用 Flutter,代码位于 flutter 目录。构建 Flutter 版本可参考仓库的 CI 配置,移动端与桌面端的 Dart 代码组织为
flutter/lib/desktop/、flutter/lib/mobile/、共享的flutter/lib/common/与flutter/lib/models/。
若走 Sciter 路线,需要自行下载 Sciter 动态库并放到目标输出目录:
| 平台 | 动态库 |
|---|---|
| Windows | sciter.dll(x64) |
| Linux | libsciter-gtk.so(x64) |
| macOS | libsciter.dylib |
从 Cargo.toml 可以看到,Sciter 集成通过 sciter-rs 依赖完成(sciter-rs = { git = "https://github.com/rustdesk-org/rust-sciter", branch = "dyn" },仅在非 Android/iOS 目标平台启用),动态库在运行时被 dlopen,因此必须预先放入 target/debug/(或 target/release/)。
二、构建依赖总览:vcpkg 管理的媒体库
RustDesk 的视频/音频管线依赖一组 C/C++ 库,统一由 vcpkg 管理:
libvpx:VP8/VP9 视频编解码;libyuv:YUV 色彩空间转换;opus:音频编码(Rust 侧通过magnum-opus绑定);aom:AV1 编解码。
在仓库根目录的 vcpkg.json 中,libvpx、libyuv、opus、aom 均以 host 与 target 双重身份声明,并且通过 "overlay-ports": ["./res/vcpkg"] 挂载了仓库自带的定制端口(补丁见 res/vcpkg,例如 aom 的 avx2 补丁、libvpx 的库命名后缀移除补丁、ffmpeg 的十余个补丁),overlay-triplets 则指向 res/vcpkg-triplets(含 Android 各架构 triplet)。也就是说,文档中的 vcpkg install libvpx libyuv opus aom 实际使用的是仓库定制过的构建配方,而非 vcpkg 上游默认版本。
各平台原始构建步骤(Raw Steps):
- 准备 Rust 开发环境与 C++ 构建环境;
- 安装 vcpkg,并正确设置
VCPKG_ROOT环境变量:- 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
- Windows:
- 运行
cargo run。
VCPKG_ROOT 如何被真正消费?从源码结构看,libs/scrap/build.rs 中的 find_package 函数按如下优先级探测依赖:Linux 上启用 linux-pkg-config feature 时优先走 pkg-config(可用 NO_PKG_CONFIG_<name>=1 环境变量禁用);否则读取 VCPKG_ROOT 并在 installed/<triplet>/ 下生成 cargo:rustc-link-search 与 cargo:include 指令;macOS Apple Silicon 上还有 Homebrew 兜底路径,找不到时直接 panic!("Couldn't find VCPKG_ROOT ...")。此外 build.rs 负责 Windows 侧 src/platform/windows.cc 与 macOS 侧 src/platform/macos.mm 的 C++ 编译,以及 Android 目标下 vcpkg 链接路径的注入。
三、各 Linux 发行版构建环境
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
openSUSE Tumbleweed
sudo zypper install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libXfixes-devel cmake alsa-lib-devel gstreamer-devel gstreamer-plugins-base-devel xdotool-devel
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 gstreamer1-devel gstreamer1-plugins-base-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
各发行版包名的差异反映了同一组底层依赖:GTK3(Sciter 的 GUI 宿主)、xcb/X11 扩展(randr、shape、xfixes,屏幕捕获与窗口操作)、alsa/PulseAudio/PipeWire(音频)、nasm/yasm(汇编汇编器,libvpx/aom 需要)、clang + libclang(构建期 bindgen 生成 FFI 绑定需要)。
安装 vcpkg
文档锁定 vcpkg 到 2023.04.15 标签以保证构建可复现:
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 上 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 后用 sed 向 CFLAGS/CXXFLAGS 中插入 -fPIC,重新 make 得到 libvpx.a,再手动拷回 vcpkg 的 installed/x64-linux/lib/ 供后续链接。
一键构建(Sciter 路线)
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
要点:Sciter 动态库必须放在 target/debug/,与二进制同级;VCPKG_ROOT 指向刚安装的 vcpkg 根目录。从 Cargo.toml 看,项目要求 rust-version = "1.75",edition 2021,默认 feature 含 use_dasp(音频重采样)。
四、使用 Docker 构建
Docker 路线把上面所有步骤封装进了仓库自带的 Dockerfile 与 entrypoint.sh,环境完全可复现。
Dockerfile 的关键事实(与文档命令一一对应):基于 debian:bullseye-slim,安装与 Ubuntu 一节等价的依赖集(额外含 libssl-dev、ca-certificates),从源码编译 CMake 3.30.6,克隆并 bootstrap 2023.04.15 版 vcpkg 后执行 vcpkg --disable-metrics install libvpx libyuv opus aom,预下载 libsciter-gtk.so,以非特权用户 user(home 为 /home/user)安装 rustup,最终 ENTRYPOINT 指向 /entrypoint.sh。
构建镜像
克隆仓库并构建容器:
git clone https://github.com/rustdesk/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
- 两个具名卷
rustdesk-git-cache/rustdesk-registry-cache缓存 cargo 的 git 依赖与 crate 注册表:首次构建耗时较长,之后的构建显著加快; PUID/PGID把宿主机用户 uid/gid 传入容器,保证挂载目录权限一致;- 需要其他构建参数时,直接追加在命令末尾,例如追加
--release构建优化版本。
从 entrypoint.sh 的源码可以看到参数处理细节:脚本 cd 进 $HOME/rustdesk,解析参数——遇到 --release 时创建 target/release/ 并把 libsciter-gtk.so 拷入其中,遇到 --target <triple> 时调用 rustup target add 注册交叉编译目标;最终固定执行 VCPKG_ROOT=/vcpkg cargo build --locked $argv。这也解释了文档中的两条注意事项:
- 产物出现在宿主机的
target/下(因$PWD已挂载),在仓库根目录运行target/debug/rustdesk或target/release/rustdesk即可,必须在仓库根目录运行,否则应用找不到所需资源; - 此方法不支持
cargo install/cargo run等子命令——entrypoint 固定调用cargo build,这类子命令会在容器内部安装或运行程序,而非宿主机。
五、源码结构导读
文档给出的文件结构如下表,结合 Cargo.toml 的依赖声明可进一步确认各模块的定位:
| 路径 | 职责 |
|---|---|
| libs/hbb_common | 视频编码封装、配置(config)、tcp/udp 网络封装、protobuf、文件传输的 fs 函数及其他工具函数;是所有模块的共享基础库 |
| libs/scrap | 屏幕捕获,覆盖 X11/Wayland/Quartz/DXGI/DRM/Android MediaCodec 等多后端(见 libs/scrap/src/common 与 libs/scrap/src/x11 等子目录) |
| libs/enigo | 平台相关的键盘/鼠标模拟,内含 linux/macos/win 三套实现(libs/enigo/src) |
| libs/clipboard | Windows/Linux/macOS 的文件复制粘贴实现(含 Windows DDE/RDP 剪贴板协议 libs/clipboard/src/windows/wf_cliprdr.c) |
| src/ui | 遗留的 Sciter UI(已弃用,文档标注 obsolete/deprecated),含 cm.html/remote.html/index.html 等界面与 .tis 脚本 |
| src/server | 音频/剪贴板/输入/视频服务与网络连接管理(src/server/mod.rs 下含 audio_service.rs、video_service.rs、input_service.rs、connection.rs 等) |
| src/client.rs | 发起对端(peer)连接 |
| src/rendezvous_mediator.rs | 与 rustdesk-server 通信,等待远端直连(TCP NAT 打洞)或中继(relay)连接建立 |
| src/platform | 平台专属代码(Windows 注册表/ACL、macOS 权限脚本、Linux 服务安装等,见 src/platform/mod.rs) |
| flutter | 桌面与移动端的 Flutter 代码(当前主力 UI,Android/iOS/Linux/macOS/Windows 平台壳齐全) |
从源码结构看,RendezvousMediator 类型在 src/server.rs、src/flutter_ffi.rs、src/ipc.rs 等文件中被引用,印证了文档所述:rendezvous_mediator.rs 是客户端信令层的核心,负责把「等待直连或中继」的状态机暴露给上层服务与 FFI 层。而构建层面的证据——build.rs 的 C++ 编译分支、libs/scrap/build.rs 的 vcpkg/pkg-config 探测、vcpkg.json 的定制端口声明——则与本文第二、三节文档中每一步环境准备严格对应,可作为排查构建问题的第一手依据。
六、适用前提与限制
- 本文构建命令以当前仓库(版本 1.4.9,见 Cargo.toml)为准;Sciter 路线在文档中被标注为更简单的入门路径,但 Sciter UI 已弃用,生产与贡献场景建议走 Flutter 路线(参考 CI 的 Flutter 构建流程);
- vcpkg 锁定在
2023.04.15,仓库通过 vcpkg.json 的baseline与overlay-ports保证依赖可复现,升级 vcpkg 版本前需评估 res/vcpkg 中各补丁的兼容性; - Docker 构建仅适用于 x64 Linux 场景(镜像固定拉取 x64 的 Sciter 动态库与
x64-linuxtriplet 的 vcpkg 产物),且不支持cargo install/cargo run子命令; - 仓库为只读参考:本文仅介绍查看、安装、运行与配置方式,不修改仓库内容。
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 StartedRust0622
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