RustDesk 源码编译指南:vcpkg 依赖、Linux 发行版适配与 Docker 容器化构建
RustDesk 是一款用 Rust 编写的开源远程桌面应用,开箱即用、无需额外配置,适合自托管部署并作为 TeamViewer 的替代方案。本文围绕官方仓库文档(原文为 docs/README-EO.md,中文可读 docs/README-ZH.md)完整讲解从依赖准备、跨平台编译命令、Linux 各发行版适配,到 Docker 容器化构建的全流程,并结合仓库源码剖析 RustDesk 的目录结构与核心模块职责,帮助你从零开始成功编译出自己的可执行文件。
项目概览:用 Rust 编写的自托管远程桌面
RustDesk 的核心卖点是数据完全由用户掌控:你可以直接连接对方,也可以使用官方的 rendezvous(会合)/relay(中继)服务器、配置自己的服务器,或参考 rustdesk-server-demo 自行编写会合/中继服务器。
从仓库 Cargo.toml 可以确认当前源码版本为 1.4.9,要求 Rust 1.75+(rust-version = "1.75"),并且这是一个 cargo workspace——除主 crate 外,还包含 8 个本地库成员:
[workspace]
members = [
"libs/scrap", "libs/hbb_common", "libs/enigo", "libs/clipboard",
"libs/virtual_display", "libs/virtual_display/dylib",
"libs/portable", "libs/remote_printer"
]
另外,桌面版的图形界面基于 sciter 引擎,因此编译/运行前需要下载 sciter 的动态库(Windows 为 sciter.dll,Linux 为 libsciter-gtk.so,macOS 为 libsciter.dylib,可从 sciter-sdk 官方仓库的 bin.win/x64、bin.lnx/x64、bin.osx 目录获取)。这一点在 Cargo.toml 中也有对应依赖:非移动端目标会链接 sciter-rs(branch = "dyn",即动态加载 sciter)。
跨平台编译步骤
官方文档给出的通用编译步骤只有三步:
- 准备好 Rust 开发环境和 C++ 编译环境;
- 安装 vcpkg(以文本方式说明:从微软 vcpkg 仓库安装)并正确设置环境变量
VCPKG_ROOT; - 执行
cargo run。
其中 vcpkg 用于安装四个 C/C++ 原生依赖,且 Windows 与 Linux/macOS 的 triplet(三元组)不同:
| 平台 | 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 |
这四个依赖对应视频/音频编解码栈:libvpx(VP8/VP9)、aom(AV1)、libyuv(像素格式转换)、opus(Opus 音频)。仓库根目录的 vcpkg.json 中声明了 libvpx、libyuv、opus、aom 等全部二进制依赖,并通过 "overlay-ports": ["./res/vcpkg"] 指向仓库自带的补丁端口 res/vcpkg(内含 aom、libvpx、libyuv、opus、ffmpeg、mfx-dispatch 的 portfile 与补丁),通过 "overlay-triplets": ["./res/vcpkg-triplets"] 提供 Android 各架构的 triplet 文件(如 res/vcpkg-triplets/x64-android.cmake)。换言之,仓库内的这些 overlay 端口保证了官方 CI 与本地构建使用同一套经过修补的依赖版本。
在 Linux 上编译:发行版依赖包清单
Linux 上编译需要先安装系统级开发包。文档按发行版给出了三份可直接复制的命令:
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
这些包分别服务于编译链(g++/gcc/nasm/yasm/cmake)、屏幕捕获(libxcb-* 系列,对应 X11 抓屏)、输入控制(libxdo/xdotool,对应 libs/enigo 的键鼠模拟)与音频(libasound2/libpulse/pipewire,对应服务端音频捕获)。
安装 vcpkg 与 libvpx 的 Fedora 修复
文档指定使用 vcpkg 的 2023.04.15 版本(与仓库 Dockerfile 中 git clone --branch 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,会导致链接失败。文档给出了手动重编译的修复方法(进入 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
提示:Dockerfile 中设置了
ENV VCPKG_FORCE_SYSTEM_BINARIES=1,让 vcpkg 使用系统自带的构建工具,这是容器环境下减少构建问题的常用做法,手动编译时也可参考。
完整编译命令序列
在依赖就绪后,官方文档给出的 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
几个关键细节:
- sciter 动态库必须放在可执行文件旁边(
target/debug/libsciter-gtk.so)。sciter-rs 以动态方式加载它,缺失时界面无法启动; - 每次执行
cargo run前需保证VCPKG_ROOT指向 vcpkg 根目录,cargo 的构建脚本(build.rs 由build = "build.rs"指定)会依据它查找 vcpkg 安装的静态库; - 可执行入口为 src/main.rs,crate 默认运行目标为
rustdesk(Cargo.toml 中default-run = "rustdesk"),另有naming(src/naming.rs)与service(src/service.rs)两个辅助二进制。
使用 Docker 编译
对于希望隔离环境的用户,仓库提供官方构建镜像 Dockerfile(基于 debian:bullseye-slim,预装 CMake 3.30.6、vcpkg 2023.04.15 及全部 apt 依赖)。构建与使用方式:
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 依赖与 registry 缓存,首次编译较慢(依赖需要缓存),后续编译显著提速; PUID/PGID环境变量用于把容器内用户映射到宿主机用户,避免产物文件属主错乱;- 容器入口脚本是 entrypoint.sh。阅读其源码可以看到它支持两种附加参数:传
--release会先mkdir -p target/release并把libsciter-gtk.so复制到 release 输出目录,最终执行VCPKG_ROOT=/vcpkg cargo build --locked;传--target <三元组>会调用rustup target add安装交叉编译目标。未传参数时默认走 debug 构建,同样会把 sciter 库复制到target/debug/。
编译完成后,在仓库根目录下运行:
target/debug/rustdesk # debug 构建
target/release/rustdesk # release 构建
文档特别提示两个限制:其一,务必在 RustDesk 仓库根目录执行,否则程序找不到必要资源;其二,cargo install、cargo run 等子命令在该 Docker 方法下暂不支持,因为它们会把安装/运行动作发生在容器内而非宿主机上。
源码结构:核心模块职责拆解
官方文档的“文件结构”一节是理解 RustDesk 架构的地图。对照当前仓库,各模块的实际内容与职责如下:
- libs/hbb_common:公共底层库。从 src/rendezvous_mediator.rs 的导入可以印证其覆盖面:
config(配置与常量,如RENDEZVOUS_PORT、CONNECT_TIMEOUT)、protobuf/rendezvous_proto(消息序列化)、socket_client(TCP/UDP 封装)、udp::FramedSocket等,是视频编解码工具、配置系统、TCP/UDP 覆盖层与文件传输 fs 函数等公用功能的汇聚点。 - libs/scrap:屏幕捕获库。其源码按显示后端组织(
src/common/下含x11.rs、wayland.rs、dxgi.rs、quartz.rs、aom.rs、hwcodec.rs、vram.rs等,并附带独立 libs/scrap/Cargo.toml),主 crate 以features = ["wayland"]引用它;仓库顶层还通过 Cargo.toml 的hwcodec、vram、drm、mediacodec等 feature 门控不同硬编码/VRAM/DRM 路径。 - libs/enigo:跨平台的键盘/鼠标控制,含
linux、macos、win三个平台实现目录(如 libs/enigo/src/linux/mod.rs),并提供examples/下的keyboard.rs、mouse.rs、timer.rs等示例;Linux 端依赖 libxdo(仓库甚至用 libs/libxdo-sys-stub 打补丁以支持无 libxdo 的 Wayland-only 环境)。 - src/ui:客户端界面(sciter HTML/TIS 脚本 + Rust 后端),包括主界面
index.html、remote.tis/remote.rs、cm.html连接管理器界面等。 - src/server:被控端服务集合。从目录可见完整的受控侧实现:
video_service.rs(视频)、audio_service.rs(音频)、clipboard_service.rs(剪贴板)、input_service.rs(输入)、display_service.rs(显示器)、connection.rs(网络连接)等,与文档描述的“音频/剪贴板/输入/视频服务与网络连接”一一对应。 - src/client.rs:客户端会话入口,启动与远端的连接。
- src/rendezvous_mediator.rs:与 rustdesk-server 通信的核心中介,负责注册公钥(
SENT_REGISTER_PK)、等待远端直连(TCP 打洞)或中继连接;源码中还有DEPLOY_RETRY_INTERVAL = 30_000(毫秒)等部署状态退避逻辑,可看出其对服务端register_pk流程的重试设计。 - src/platform:操作系统特定代码,细分为
windows/、linux.rs、macos.rs/macos.mm及privileges_scripts/(macOS 安装/卸载守护进程脚本)等;src/lib.rs 按目标平台条件编译这些模块(iOS 不启用 server 与 rendezvous_mediator,Android/iOS 或flutterfeature 下不启用 sciter 版 ui,而改用 flutter/ 目录下的 Flutter 前端)。
编译配置与 Release 优化
Cargo.toml 底部还定义了影响产物质量的重要配置,值得在自编译时了解:
[profile.release]
lto = true
codegen-units = 1
panic = 'abort'
strip = true
rpath = true
即 release 构建启用 LTO、单代码生成单元、abort 式 panic、符号剥离与 rpath,产物更小更紧凑;[profile.dev] 则设为 debug = 1 加快迭代。此外 [features] 提供了 flutter、hwcodec、drm、drm-wake、screencapturekit、linux-pkg-config 等开关(例如 drm-wake 在 drm 捕获之外单独门控“显示唤醒”写入逻辑),可按目标平台裁剪功能后使用 cargo build --features <feature> 构建。
小结
按照本文流程——准备 Rust 1.75+ 与 C++ 工具链、用固定版本的 vcpkg 安装 libvpx/libyuv/opus/aom 四个编解码依赖、补齐对应发行版的系统开发包(Fedora 需额外修复 libvpx 的 -fPIC)、放置 sciter 动态库,再执行 VCPKG_ROOT=... cargo run,或改用仓库自带的 rustdesk-builder Docker 镜像完成容器化构建——即可在本机得到 target/debug/rustdesk 或 target/release/rustdesk。若后续要深入理解某一子系统,可按“文件结构”一节的模块划分,从 libs/hbb_common、libs/scrap、src/server 与 src/rendezvous_mediator.rs 入手阅读。RustDesk 欢迎社区贡献,翻译与维护相关说明可参考 docs/CONTRIBUTING.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