RustDesk 从源码构建完全指南:vcpkg 依赖体系、Linux 各发行版安装与 Docker 构建实战
RustDesk 是一款用 Rust 编写的、面向自托管场景的开源远程桌面软件,其官方文档(见 docs/README-RO.md,为 主 README 的罗马尼亚语版)中沉淀了一套完整的从源码构建指南。本文以该构建文档为主体,逐节展开其核心内容——原生(Raw)构建流程、Linux 四大发行版的依赖安装、Docker 容器化构建,并结合仓库中的 Dockerfile、entrypoint.sh、vcpkg.json 与 build.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++ 依赖 → 编译运行":
- 准备 Rust 开发环境(rustup/cargo)与 C++ 构建环境;
- 安装 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
- Windows:
- 运行
cargo run编译并启动。
结合仓库源码可以看到这些依赖的确切用途与解析方式:
- 仓库根目录的 vcpkg.json 是 vcpkg manifest 模式下的权威依赖清单,除文档提到的
aom、libvpx、libyuv、opus外,还声明了libjpeg-turbo、mfx-dispatch(Intel 硬件编码,限定((x86 | x64) & (android | linux)) | (windows & !uwp)平台)以及ffmpeg(静态构建场景,带amf/nvcodec/qsv硬件编码特性开关)。这些特性对应 Cargo.toml 中的hwcodec、vram、mediacodec、drm等 feature 开关,用于可选启用硬件编解码路径。清单还通过overlay-ports: ./res/vcpkg与overlay-triplets: ./res/vcpkg-triplets引用仓库内自维护的端口定义(如 res/vcpkg/aom/portfile.cmake、res/vcpkg/ffmpeg/portfile.cmake),说明官方对上游 vcpkg 端口做了大量定制补丁。 - 构建脚本 build.rs 解释了"C++ 构建环境"从何而来:Windows 下通过
cccrate 编译src/platform/windows.cc与src/platform/windows_delete_test_cert.cc并链接WtsApi32(见 build.rs);macOS 下以-std=c++17编译src/platform/macos.mm并链接ApplicationServicesframework(见 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-dev、libxcb-*-dev 为 Sciter UI 与 Linux 屏幕捕获(libs/scrap)提供 X11 支持;libasound2-dev/libpulse-dev 支撑音频服务(src/server/audio_service.rs);libxdo-dev 供 libs/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)
文档推荐的另一条路线是用容器隔离构建环境,官方仓库根目录的 Dockerfile 与 entrypoint.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-dev、libxcb-*-dev、libasound2-dev、libpulse-dev、gstreamer 等),并额外补了libssl-dev(Linux 目标下 Cargo.toml 中openssl = { version = "0.10", features = ["vendored"] }编译需要); - 源码编译安装 CMake 3.30.6(Dockerfile),避开发行版旧版本;
- vcpkg 同样固定
2023.04.15并预装libvpx libyuv opus aom,且设置VCPKG_FORCE_SYSTEM_BINARIES=1(Dockerfile)强制使用系统 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-cache、rustdesk-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
文档明确提醒的三条限制,务必遵守:
- 必须在 RustDesk 仓库根目录下执行,否则应用可能找不到所需资源(UI 文件、
libsciter-gtk.so等按相对路径加载); - 首次构建较慢,需等待依赖缓存建立,后续构建(得益于 cargo 缓存卷)会明显变快;
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.rs;unix-file-copy-paste feature 引入 x11-clipboard/x11rb |
| src/ui | 旧版 Sciter UI(已废弃) | 包含 cm.html/remote.html 等 Sciter 页面;文档明确标注 deprecated |
| src/server | 音频/剪贴板/输入/视频服务及网络连接 | 含 audio_service.rs、display_service.rs、input_service.rs、clipboard_service.rs、connection.rs 等 |
| src/client.rs | 发起一次 peer 连接 | 与 src/client/ 下的 io_loop.rs、screenshot.rs 等配套 |
| src/rendezvous_mediator.rs | 与 rustdesk-server 通信,等待远端直连(TCP 打洞)或 relay 中转连接 | 从源码结构看,其配合 stunclient、kcp-sys 依赖(见 Cargo.toml)完成 NAT 穿透与可靠传输 |
| src/platform | 平台特定代码 | 含 linux.rs、macos.mm、windows.rs 及特权脚本 privileges_scripts/ |
| flutter | 桌面与移动端 Flutter 代码 | 现行主 UI;flutter/lib/desktop/、flutter/lib/mobile/、flutter/lib/common/ 分层 |
此外,workspace 中还包含 libs/virtual_display、libs/portable、libs/remote_printer 等辅助 crate(见 Cargo.toml),分别对应虚拟显示器、便携版与远程打印机功能,属于在主线构建之外的扩展构建目标。
六、小结与适用前提
本文继承并展开了 docs/README-RO.md 构建文档的全部核心步骤:
- 环境准备:Rust ≥ 1.75 工具链 + C/C++ 编译器 + vcpkg(固定
2023.04.15)+VCPKG_ROOT环境变量; - 依赖三件套:四个媒体库
libvpx/libyuv/opus/aom(Windows 用x64-windows-statictriplet);Sciter 动态库按平台手工下载; - 两条构建路径:Linux 原生构建(按发行版装系统依赖,Fedora 需
-fPIC补丁)与 Docker 构建(rustdesk-builder镜像 + 缓存卷 +--release/--target可选参数); - 结构认知:
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.yml、flutter-ci.yml 等)为准。所有命令均以当前仓库实际文件为验证依据,可直接在克隆后的仓库根目录执行。
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 StartedRust0622
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