首页
/ RustDesk 自托管远程桌面构建指南:vcpkg 依赖、Docker 编译流程与代码结构解析

RustDesk 自托管远程桌面构建指南:vcpkg 依赖、Docker 编译流程与代码结构解析

2026-09-04 20:44:45作者:丁柯新Fawn

本篇技术指南围绕 RustDesk 仓库的官方编译文档展开,完整覆盖从 vcpkg 编解码依赖安装、各 Linux 发行版系统依赖配置,到 Docker 容器化构建与可执行文件运行方式的全流程操作,并对照仓库源码(Cargo 清单、Dockerfile、构建脚本)说明每个步骤背后的实现依据。读完本文,你可以从零开始在本机或 Docker 环境中编译出可运行的 RustDesk 可执行文件,并清晰理解 libs/src/flutter/ 三大代码板块的分工。

项目定位:可自托管的远程桌面应用

RustDesk 是一个用 Rust 编写的远程控制桌面软件,其设计目标是对等方案(如 TeamViewer 类产品)的自托管替代品:功能开箱即用、无需强制依赖官方服务,数据完全由使用者自行掌控。使用者可以选择使用社区公共的 rendezvous/relay 服务器,也可以配置自己的服务器,或完全自行搭建 rendezvous/relay 服务。

对开发者而言,这种"客户端 + 可选自托管服务端"的架构意味着:只要能把 RustDesk 客户端编译出来,后续的所有服务端部署与网络穿透逻辑都建立在客户端这一套代码之上。因此官方文档将"如何编译"作为第一优先级内容,本文正是对其完整继承与源码级展开。

需要说明:仓库当前的包版本为 1.4.9,最低 Rust 工具链要求为 1.75(见 Cargo.tomlversionrust-version 字段),本文中的构建步骤以该仓库当前内容为准。

编译依赖总览:Rust/C++ 环境 + vcpkg + UI 动态库

三类依赖缺一不可

官方文档的"Dependencies"部分指出,桌面端使用 Flutter 或 Sciter(已弃用)作为 UI 层,而文档给出的最简路径是 Sciter 方案,因为入门更容易。完整构建需要三类依赖:

  1. Rust 与 C++ 开发环境:RustDesk 核心为 Rust,但底层编解码库(VPX、AV1、Opus 等)是 C/C++ 实现,需要 gcc/g++、CMake、Ninja 等工具链;
  2. vcpkg 安装的四个编解码包libvpx(VP8/VP9)、libyuv(YUV 像素格式转换)、opus(音频编码)、aom(AV1 编解码)。安装命令按平台区分:
    # 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_ROOT,指向 vcpkg 的安装根目录;
  3. Sciter 动态库(仅 Sciter UI 构建需要):按平台下载 sciter.dll(Windows x64)、libsciter-gtk.so(Linux x64)、libsciter.dylib(macOS),放入构建产物目录即可。

从源码结构看,第 3 点与 Cargo.toml 的依赖声明互相印证:非 Android/iOS 目标下引入了 sciter-rs 绑定;而 flutter 是一个可选 feature(flutter = ["flutter_rust_bridge"]),并不包含在 default feature 中——因此默认 cargo run 走的就是 Sciter UI 路径,与文档描述一致。若未来切换 Flutter UI,则需显式开启 --features flutter

仓库根目录的 vcpkg.json 进一步揭示了完整的依赖面:除了上述四个核心包,还通过 overlay-ports 指向 res/vcpkg 目录下的定制 port(aom、ffmpeg、libvpx、libyuv、mfx-dispatch、opus 均带有 RustDesk 自维护的补丁与 portfile),并通过 overlay-triplets 引用 res/vcpkg-triplets 中为 Android 各架构定制的 triplet 文件。其中 ffmpeg 仅在静态链接平台(Windows、Linux 非 32 位 ARM、macOS)引入,并带有 qsv/amf/nvcodec 硬件编解码 feature——对应 Cargo.toml 中的 hwcodecvrammediacodecdrm 等编译开关。也就是说,基础构建只需四个包,硬件加速构建才需要 ffmpeg 那一整套重依赖

构建脚本如何消费 vcpkg

RustDesk 在编译期通过 build.rs 系列脚本把 vcpkg 产物接入链接器。例如主包 build.rs 中直接 std::env::var("VCPKG_ROOT") 读取该环境变量(Android 目标下还会把 installed/<triple>/lib 加入链接搜索路径);屏幕捕获库 libs/scrap/build.rs 则在找不到 VCPKG_ROOT 时给出明确的 panic 提示,并允许 macOS arm64 回退到 Homebrew 路径。这就是为什么环境变量配错时构建会直接失败而不是静默降级。

各 Linux 发行版的系统依赖安装

不同发行版的包名差异较大,官方文档按发行版给出了完整的 apt/zypper/yum/pacman 命令,以下逐一继承:

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

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

这些依赖可以按功能归为四组:通用工具链(gcc/g++、cmake、nasm/yasm 汇编器、make)、GTK 3 与 X11 扩展(libgtk-3-dev、libxcb-*、libXfixes、libxdo)、音频栈(ALSA、PulseAudio、GStreamer)、辅助工具(clang、ninja-build、zip/unzip)。这与容器化构建中实际安装的系统包高度一致,可作为下文 Docker 章节的对照依据。

安装 vcpkg 与 libvpx 的 Fedora 补丁

官方文档将 vcpkg 固定在 2023.04.15 版本(Dockerfile 同样使用该 tag,保证 CI 与本地行为一致),安装步骤如下:

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 修复(可选)

在 Fedora 上,libvpx 的 vcpkg 构建会因缺少 -fPIC 标志导致链接失败。官方文档给出的手工修复流程是:进入 vcpkg/buildtrees/libvpx/src 下的源码目录,执行 ./configure 后用 sed 给 Makefile 中的 CFLAGS/CXXFLAGS 注入 -fPIC,再 make 并把生成的 libvpx.a 复制到 $HOME/vcpkg/installed/x64-linux/lib/。遇到相同报错时可按此思路处理,或考虑换用其他发行版构建。

本机编译与运行(Sciter UI 路径)

环境准备完成后,完整的编译运行流程为:

# 1. 安装 Rust 工具链
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env

# 2. 获取代码(本仓库地址)
git clone https://gitcode.com/GitHub_Trending/ru/rustdesk
cd rustdesk

# 3. 放置 Sciter 动态库
mkdir -p target/debug
# 下载 libsciter-gtk.so(Linux x64 版 Sciter 动态库)后:
mv libsciter-gtk.so target/debug

# 4. 编译并运行
VCPKG_ROOT=$HOME/vcpkg cargo run

运行产物与执行方式:

# debug 构建
target/debug/rustdesk
# release 构建(cargo run --release 或 cargo build --release)
target/release/rustdesk

两点重要注意事项(原文档明确强调):

  • 必须从仓库根目录执行,否则应用可能找不到所需的资源文件;
  • release 构建的优化配置相当激进:Cargo.toml[profile.release] 开启了 lto = truecodegen-units = 1panic = 'abort'strip = true,因此 release 编译耗时明显更长,但产物更小、运行更快。

Docker 方式编译:一次构建,反复复用

官方文档提供了完整的容器化构建方案,避免在宿主机污染编译环境。核心思路是:用 Dockerfile 预装好全部工具链与 vcpkg 依赖构建基础镜像,之后每次编译只需把仓库目录挂载进容器跑 entrypoint 脚本

第一步:构建构建器镜像

git clone https://gitcode.com/GitHub_Trending/ru/rustdesk
cd rustdesk
docker build -t "rustdesk-builder" .

仓库根目录的 Dockerfile 基于 debian:bullseye-slim,关键配置包括:

  • 一次性安装与上文 Ubuntu 章节对应的系统包(g++/gcc、nasm/yasm、libgtk-3-dev、clang、各 libxcb/libx 开发包、ALSA/PulseAudio/GStreamer 等),并设置 DEBIAN_FRONTEND=noninteractiveVCPKG_FORCE_SYSTEM_BINARIES=1(后者让 vcpkg 复用系统的 cmake/gperf 等二进制,加快构建);
  • 源码编译安装 CMake 3.30.6;
  • 克隆 vcpkg 并固定 --branch 2023.04.15--disable-metrics 安装 libvpx libyuv opus aom 四个包;
  • 创建非 root 的 user 用户(/home/user),预先下载 libsciter-gtk.so 到其主目录,并以普通用户身份安装 Rust 工具链。

第二步:挂载仓库并执行编译

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 把当前仓库目录挂载为容器内工作目录
-v rustdesk-git-cache:... / rustdesk-registry-cache:... 两个命名卷分别缓存 Cargo 的 git 依赖与 crates registry,首次构建较慢(需拉取全部依赖),后续构建显著提速
-e PUID/PGID 透传宿主机用户/组 ID,保证容器内生成的文件在宿主机上的属主正确

entrypoint 脚本的参数解析

容器入口是 entrypoint.sh,它会把 docker run 末尾追加的 <OPTIONAL-ARGS> 原样传给 cargo build。脚本内部逻辑(entrypoint.sh):

  • --release:置位 release 模式,并把 libsciter-gtk.so 拷贝到 target/release/
  • --target <triple>:自动调用 rustup target add 添加交叉编译目标;
  • 未传 --release 时,自动把动态库拷贝到 target/debug/
  • 最终执行 VCPKG_ROOT=/vcpkg cargo build --locked $argv--locked 保证严格使用 Cargo.lock 锁定的依赖版本。

因此,若想要一个优化过的 release 版本,只需在命令末尾追加参数:

docker run --rm -it -v $PWD:/home/user/rustdesk ... rustdesk-builder --release

文档同时提醒:installrun 等 cargo 子命令在此方式下不受支持,因为它们会在容器内部而非宿主机上安装/执行程序。构建产物落在挂载进来的仓库目录中,回到宿主机从仓库根目录执行:

target/debug/rustdesk    # 或
target/release/rustdesk

代码文件结构:文档描述与源码事实对照

官方文档给出了仓库的板块划分,以下逐条继承,并结合当前仓库实际内容补充说明:

路径 职责(文档描述) 源码侧印证
libs/hbb_common 视频编解码封装、配置、tcp/udp wrapper、protobuf、文件传输等公共工具 主包与 libs/scrap/build.rs 均依赖它;build.rs 中调用其 gen_version() 生成版本信息
libs/scrap 屏幕捕获 支持 Windows/macOS/Linux 多后端,帧格式为 packed BGRA;README 声明 Linux 需 XCB + SHM + RandR,Windows 需 DirectX 11.1;其 build.rs 负责对接 vcpkg/ffmpeg
libs/enigo 各平台键盘/鼠标控制 Cargo.toml 中以 features = ["with_serde"] 引入,含 linux/macos/win 三套实现
libs/clipboard Windows/Linux/macOS 的文件级复制粘贴实现 含 unix、windows 双平台子模块
src/ui Sciter UI(已弃用) sciter-rs 绑定加载 *.tis/*.html/*.css 资源
src/server 音频/剪贴板/输入/视频服务与网络连接 含 audio_service、video_service、input_service、clipboard_service 等服务模块
src/client.rs 发起 peer 连接 配合 src/client/ 下的 io_loop、screenshot、file_trait 等模块
src/rendezvous_mediator.rs 与 rustdesk-server 通信,等待直连(TCP 打洞)或中继(relayed)连接 该文件是 rendezvous 握手逻辑的入口,对应文档中"等待直接连接或间接中继"的描述
src/platform 平台相关代码 含 linux、macos、windows 子模块及特权脚本
flutter 桌面与移动端 Flutter UI 完整 Dart 工程(android/ios/linux/macos/windows 平台目录),当前 UI 的主力演进方向

除文档列出的目录外,当前仓库的 Cargo.toml workspace 还纳入了 libs/virtual_display(Windows 虚拟显示器)、libs/portable(便携模式)与 libs/remote_printer(远程打印)三个库,反映项目在文档基础描述之上持续扩充的能力面。

合规声明

原文档附带的滥用免责声明同样重要:RustDesk 开发者不认可也不支持任何不道德或非法用途;未授权访问、越权控制、侵犯隐私等行为严格违背项目准则,作者不对应用的滥用承担责任。远程桌面工具应当仅用于获得明确授权的设备管理场景。

小结

本文完整继承了官方编译文档的骨架——vcpkg 四依赖安装、四大 Linux 发行版系统包清单、libvpx Fedora 补丁、rustup + cargo run 本机流程、Docker 两步构建法,以及仓库板块结构表——并在每一步补充了可核验的源码依据:VCPKG_ROOTbuild.rs 中的读取位置、vcpkg.jsonres/vcpkg 覆盖 port 的扩展依赖、Dockerfile 中固定的 vcpkg tag 与非 root 构建用户、entrypoint.sh--release/--target 的解析、release profile 的 LTO/strip 优化配置。掌握以上内容后,你可以选择本机直编或 Docker 容器两条路径之一,稳定产出 RustDesk 的可执行文件,并在此基础上继续探索自托管服务端与网络穿透配置。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.12 K
2.72 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
527
590
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
904
1.82 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
854
1.34 K
docsdocs
暂无描述
Markdown
889
5.78 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.52 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.33 K
1.45 K
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
981
502
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
540
384