首页
/ RustDesk 编译构建完全指南:本地 vcpkg 构建、各系统依赖配置与 Docker 构建

RustDesk 编译构建完全指南:本地 vcpkg 构建、各系统依赖配置与 Docker 构建

2026-09-04 10:43:16作者:蔡怀权

本文以 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"

构建产物是一个主二进制 rustdeskdefault-run = "rustdesk"),同时以 cdylibstaticlibrlib 形式导出 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.rsremote.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:在静态构建(static triplet)的 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.cmakex64-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

基本流程为:

  1. 准备 Rust 开发环境与 C++ 编译器(g++/clang 等);
  2. 下载并安装 vcpkg,设置环境变量 VCPKG_ROOT 指向安装目录(vcpkg 构建系统通过它定位产物);
  3. 按上文命令安装 libvpx libyuv opus aom
  4. 运行 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.rscommon/vram.rscommon/mediacodec.rscommon/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 构建:预编译好一切的一键容器

仓库根目录提供了 Dockerfileentrypoint.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 aomVCPKG_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-cacherustdesk-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.rswayland.rsquartz.rsdxgi.rsmediacodec.rshwcodec.rs 等),libs/scrap/examples/ 提供 screenshot.rsrecord-screen.rs 等独立验证工具
libs/enigo 跨平台键鼠注入抽象,分 linux/macos/win/ 三套实现,libs/enigo/examples/mouse.rskeyboard.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.ccmacos.mmlinux.rsdelegate.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 使用的构建脚本,供深入参考:

小结

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 的原始步骤配合本指南的源码定位,即可完成从克隆到可运行二进制的完整构建。

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

项目优选

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