首页
/ RustDesk 从源码构建完全指南:vcpkg 依赖体系、Linux 各发行版安装与 Docker 构建实战

RustDesk 从源码构建完全指南:vcpkg 依赖体系、Linux 各发行版安装与 Docker 构建实战

2026-09-04 19:51:43作者:蔡怀权

RustDesk 是一款用 Rust 编写的、面向自托管场景的开源远程桌面软件,其官方文档(见 docs/README-RO.md,为 主 README 的罗马尼亚语版)中沉淀了一套完整的从源码构建指南。本文以该构建文档为主体,逐节展开其核心内容——原生(Raw)构建流程、Linux 四大发行版的依赖安装、Docker 容器化构建,并结合仓库中的 Dockerfileentrypoint.shvcpkg.jsonbuild.rs 等源码级证据,解释每一步命令背后的原因,帮助读者独立完成 RustDesk 桌面版的编译、运行与二次开发准备。

[!注意] 滥用免责声明(原文档明确要求):RustDesk 开发者不支持也不认可任何不道德或非法的使用行为。未经授权访问、控制他人设备或侵犯隐私等滥用行为,严重违背项目准则,作者对应用的任何误用不承担责任。

一、项目定位与构建前置概念

根据官方文档描述,RustDesk 是一款"开箱即用"的远程桌面解决方案,无需额外配置即可工作;用户对自身数据拥有完全控制权,可使用官方的 rendezvous/relay 服务器,也可以自建或自行编写 rendezvous/relay 服务器。项目同时欢迎社区贡献,入门贡献指南见 CONTRIBUTING.md

在动手构建之前,必须先理解文档中给出的一个关键分叉:桌面版 GUI 存在两套实现

  • Sciter(已废弃):文档明确指出 "Desktop versions use Flutter or Sciter (deprecated) for GUI",且本构建教程只针对 Sciter,因为其更简单、对初学者更友好;
  • Flutter(现行主 UI):桌面与移动端界面位于 flutter 目录,若需构建 Flutter 版本应参考仓库 CI 中的 Flutter 构建工作流(如 .github/workflows/flutter-build.yml)。

由于 Sciter 是一个动态链接库,构建/运行前需要自行下载对应平台的 Sciter 动态库并放到正确位置:

平台 动态库文件名 放置位置(Linux 构建流程中)
Windows sciter.dll 程序目录
Linux libsciter-gtk.so target/debug/(见下文 Build 小节)
macOS libsciter.dylib 程序目录

二、原生构建流程(Raw Steps to build)

文档给出的最精简构建流程共三步,本质是"准备工具链 → 安装 C/C++ 依赖 → 编译运行":

  1. 准备 Rust 开发环境(rustup/cargo)与 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.json 是 vcpkg manifest 模式下的权威依赖清单,除文档提到的 aomlibvpxlibyuvopus 外,还声明了 libjpeg-turbomfx-dispatch(Intel 硬件编码,限定 ((x86 | x64) & (android | linux)) | (windows & !uwp) 平台)以及 ffmpeg(静态构建场景,带 amf/nvcodec/qsv 硬件编码特性开关)。这些特性对应 Cargo.toml 中的 hwcodecvrammediacodecdrm 等 feature 开关,用于可选启用硬件编解码路径。清单还通过 overlay-ports: ./res/vcpkgoverlay-triplets: ./res/vcpkg-triplets 引用仓库内自维护的端口定义(如 res/vcpkg/aom/portfile.cmakeres/vcpkg/ffmpeg/portfile.cmake),说明官方对上游 vcpkg 端口做了大量定制补丁。
  • 构建脚本 build.rs 解释了"C++ 构建环境"从何而来:Windows 下通过 cc crate 编译 src/platform/windows.ccsrc/platform/windows_delete_test_cert.cc 并链接 WtsApi32(见 build.rs);macOS 下以 -std=c++17 编译 src/platform/macos.mm 并链接 ApplicationServices framework(见 build.rs)。因此即使主代码是 Rust,也必须具备可用的 C/C++ 编译器。
  • Cargo.toml 声明了 rust-version = "1.75",即构建需要不低于该版本的 Rust 工具链;default-run = "rustdesk" 保证 cargo run 启动的就是主程序而非 naming/service 等附加二进制。

三、Linux 各发行版构建指南

文档按发行版分别给出了完整的依赖安装命令,以下完整保留并补充各依赖的作用说明。

3.1 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

依赖对应关系:nasm/yasm 是汇编器(libvpx/aom 编译需要);libgtk-3-devlibxcb-*-dev 为 Sciter UI 与 Linux 屏幕捕获(libs/scrap)提供 X11 支持;libasound2-dev/libpulse-dev 支撑音频服务(src/server/audio_service.rs);libxdo-devlibs/enigo 的输入模拟使用(注意 Cargo.toml 中通过 [patch.crates-io]libxdo-sys 打桩为 libs/libxdo-sys-stub,允许在无 libxdo 的 Wayland-only 系统上编译)。

3.2 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

3.3 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

3.4 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

3.5 安装 vcpkg(固定版本)

文档特别要求 checkout 到 2023.04.15 标签,这一固定版本在 Dockerfile 中被原样采用(git clone --branch 2023.04.15 --depth=1),说明官方构建链对该 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

3.6 Fedora 下修复 libvpx

由于 Fedora 的共享库默认要求位置无关代码(PIE),vcpkg 构建出的 libvpx.a 可能因缺少 -fPIC 而链接失败。文档给出的修复方式是手动重编 libvpx 并打回 installed 目录:

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

sed 两行的作用是把 -fPIC 编译选项注入 Makefile 的 CFLAGS/CXXFLAGS,这是标准的共享/PIE 链接错误处理手段。)

3.7 最终构建(Build)

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
source $HOME/.cargo/env
git clone --recurse-submodules 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

几个实操要点:

  • --recurse-submodules 不可省略:.gitmodules 声明 libs/hbb_common 是 git 子模块(独立仓库 hbb_common),不带子模块的克隆会在依赖解析阶段直接失败;
  • libsciter-gtk.so 必须与可执行文件同目录,cargo run 生成的 target/debug/rustdesk 运行时会加载它;
  • VCPKG_ROOT 是 cargo 构建链找到 libvpx/libyuv/opus/aom 的头文件与静态库的入口(build.rs 中 Android 交叉编译路径同样读取该变量拼接 installed/<target>/lib 链接搜索路径)。

四、Docker 构建(How to build with Docker)

文档推荐的另一条路线是用容器隔离构建环境,官方仓库根目录的 Dockerfileentrypoint.sh 就是这条路线的完整实现。

4.1 构建镜像

git clone https://github.com/rustdesk/rustdesk
cd rustdesk
git submodule update --init --recursive
docker build -t "rustdesk-builder" .

Dockerfile 源码可以确认镜像的关键设计:

  • 基础镜像为 debian:bullseye-slim,预装与 3.1 节 Ubuntu 清单高度一致的依赖(gcc/g++、nasm、yasm、libgtk-3-devlibxcb-*-devlibasound2-devlibpulse-dev、gstreamer 等),并额外补了 libssl-dev(Linux 目标下 Cargo.tomlopenssl = { version = "0.10", features = ["vendored"] } 编译需要);
  • 源码编译安装 CMake 3.30.6(Dockerfile),避开发行版旧版本;
  • vcpkg 同样固定 2023.04.15 并预装 libvpx libyuv opus aom,且设置 VCPKG_FORCE_SYSTEM_BINARIES=1Dockerfile)强制使用系统 gcc/g++ 而非 vcpkg 自带编译器,保证 ABI 一致;
  • 创建非 root 用户 user 并以普通用户安装 rustup(Dockerfile),规避 cargo 缓存的 root 属主问题——这正是 4.2 节 docker run 时传 -e PUID / -e PGID 与宿主机 uid/gid 对齐的原因;
  • 镜像内已预下载 libsciter-gtk.so/home/user/Dockerfile)。

4.2 运行构建容器

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 把宿主机仓库挂载为工作目录(构建产物直接落回宿主机的 target/);两个命名卷 rustdesk-git-cacherustdesk-registry-cache 分别缓存 cargo 的 git 依赖与 crates.io 注册表索引,使首次构建之后的增量构建显著加速。

entrypoint.sh 是容器的 ENTRYPOINT,它解析传入参数后以 VCPKG_ROOT=/vcpkg cargo build --locked $argv 收尾(见 entrypoint.sh)。结合脚本源码可以补充文档未展开的两个细节:

  • --release 支持:脚本检测到 --release 时会 mkdir -p target/release,把镜像内的 libsciter-gtk.so 复制到 target/release/,再将其从参数中剔除、用内部标记触发 release 构建(见 entrypoint.sh)。因此文档说"如需构建优化版,在命令末尾追加 --release"——--locked 保证按 Cargo.lock 精确解析,构建可复现;
  • --target <triple> 支持:脚本会先执行 rustup target add <triple> 再透传给 cargo,可用于交叉编译(例如 Android 目标,配合 build.rs 中的 install_android_deps 逻辑)。

4.3 运行构建产物与注意事项

target/debug/rustdesk

或 release 版本:

target/release/rustdesk

文档明确提醒的三条限制,务必遵守:

  1. 必须在 RustDesk 仓库根目录下执行,否则应用可能找不到所需资源(UI 文件、libsciter-gtk.so 等按相对路径加载);
  2. 首次构建较慢,需等待依赖缓存建立,后续构建(得益于 cargo 缓存卷)会明显变快;
  3. cargo install / cargo run 等子命令目前不受此方式支持——那会把程序安装或运行在容器内而非宿主机上;entrypoint.sh 固定使用 cargo build,产物输出到宿主机挂载的 target/ 目录,由用户自行运行。

五、仓库文件结构(File Structure)

文档最后给出了核心目录的职能划分,这里完整继承该清单,并对照 Cargo.toml 的 workspace 成员与 AGENTS.md 的项目布局说明加以印证:

路径 文档中的职责描述 源码级印证
libs/hbb_common 视频编解码、配置、TCP/UDP 封装、protobuf、文件传输 fs 函数及其他工具函数 git 子模块(独立仓库),.gitmodules;workspace 成员
libs/scrap 屏幕捕获 含 X11/Wayland/DXGI/Quartz 等分平台捕获实现(如 libs/scrap/common/linux.rs);hwcodec/drm 等 feature 在此定义
libs/enigo 分平台的键盘/鼠标控制 linux/macos/win/ 实现;Linux 下依赖 libxdo
libs/clipboard Windows/Linux/macOS 的文件复制粘贴实现 platform/unix/platform/windows.rsunix-file-copy-paste feature 引入 x11-clipboard/x11rb
src/ui 旧版 Sciter UI(已废弃) 包含 cm.html/remote.html 等 Sciter 页面;文档明确标注 deprecated
src/server 音频/剪贴板/输入/视频服务及网络连接 audio_service.rsdisplay_service.rsinput_service.rsclipboard_service.rsconnection.rs
src/client.rs 发起一次 peer 连接 src/client/ 下的 io_loop.rsscreenshot.rs 等配套
src/rendezvous_mediator.rs 与 rustdesk-server 通信,等待远端直连(TCP 打洞)或 relay 中转连接 从源码结构看,其配合 stunclientkcp-sys 依赖(见 Cargo.toml)完成 NAT 穿透与可靠传输
src/platform 平台特定代码 linux.rsmacos.mmwindows.rs 及特权脚本 privileges_scripts/
flutter 桌面与移动端 Flutter 代码 现行主 UI;flutter/lib/desktop/flutter/lib/mobile/flutter/lib/common/ 分层

此外,workspace 中还包含 libs/virtual_displaylibs/portablelibs/remote_printer 等辅助 crate(见 Cargo.toml),分别对应虚拟显示器、便携版与远程打印机功能,属于在主线构建之外的扩展构建目标。

六、小结与适用前提

本文继承并展开了 docs/README-RO.md 构建文档的全部核心步骤:

  1. 环境准备:Rust ≥ 1.75 工具链 + C/C++ 编译器 + vcpkg(固定 2023.04.15)+ VCPKG_ROOT 环境变量;
  2. 依赖三件套:四个媒体库 libvpx/libyuv/opus/aom(Windows 用 x64-windows-static triplet);Sciter 动态库按平台手工下载;
  3. 两条构建路径:Linux 原生构建(按发行版装系统依赖,Fedora 需 -fPIC 补丁)与 Docker 构建(rustdesk-builder 镜像 + 缓存卷 + --release/--target 可选参数);
  4. 结构认知libs/ 四件套(hbb_common、scrap、enigo、clipboard)+ src/(server/client/rendezvous_mediator/platform/ui)+ flutter/ 的现代 UI。

适用前提提醒:本文档对应的构建流程以 Sciter UI 路径为默认(该 UI 已被官方标记为 deprecated),若目标是从源码构建当前主流的 Flutter 桌面/移动端版本,请改以仓库 CI 中的 Flutter 构建工作流(.github/workflows/flutter-build.ymlflutter-ci.yml 等)为准。所有命令均以当前仓库实际文件为验证依据,可直接在克隆后的仓库根目录执行。

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

项目优选

收起
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++
903
1.82 K
docsdocs
暂无描述
Markdown
888
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.51 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