首页
/ RustDesk 从源码构建完全指南:vcpkg 依赖、Linux 发行版适配与 Docker 构建

RustDesk 从源码构建完全指南:vcpkg 依赖、Linux 发行版适配与 Docker 构建

2026-09-04 14:08:25作者:何举烈Damon

本篇以 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 中,libvpxlibyuvopusaom 均以 hosttarget 双重身份声明,并且通过 "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):

  1. 准备 Rust 开发环境与 C++ 构建环境;
  2. 安装 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
  3. 运行 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-searchcargo: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 后用 sedCFLAGS/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 路线把上面所有步骤封装进了仓库自带的 Dockerfileentrypoint.sh,环境完全可复现。

Dockerfile 的关键事实(与文档命令一一对应):基于 debian:bullseye-slim,安装与 Ubuntu 一节等价的依赖集(额外含 libssl-devca-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。这也解释了文档中的两条注意事项:

  1. 产物出现在宿主机的 target/ 下(因 $PWD 已挂载),在仓库根目录运行 target/debug/rustdesktarget/release/rustdesk 即可,必须在仓库根目录运行,否则应用找不到所需资源;
  2. 此方法不支持 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/commonlibs/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.rsvideo_service.rsinput_service.rsconnection.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.rssrc/flutter_ffi.rssrc/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.jsonbaselineoverlay-ports 保证依赖可复现,升级 vcpkg 版本前需评估 res/vcpkg 中各补丁的兼容性;
  • Docker 构建仅适用于 x64 Linux 场景(镜像固定拉取 x64 的 Sciter 动态库与 x64-linux triplet 的 vcpkg 产物),且不支持 cargo install/cargo run 子命令;
  • 仓库为只读参考:本文仅介绍查看、安装、运行与配置方式,不修改仓库内容。
登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.12 K
2.72 K
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
904
1.82 K
docsdocs
暂无描述
Markdown
889
5.78 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
854
1.34 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
527
590
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.52 K
1.01 K
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.33 K
1.45 K
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
540
384
flutter_flutterflutter_flutter
本仓库是 Flutter SDK 与 Flutter Engine 的 OpenHarmony 适配版本,由 CPF-Flutter 团队维护。开发者可使用熟悉的 Flutter 技术栈开发 OpenHarmony 应用,3.35.7 及以后的适配版本可基于本仓库源码构建支持 OpenHarmony 的 Flutter Engine。
Dart
1.17 K
341