RustDesk 源码构建指南:vcpkg 依赖、Linux 发行版安装与 Docker 容器化构建
本篇以 RustDesk 仓库的芬兰语官方 README(docs/README-FI.md)为骨架,系统梳理该自托管远程桌面软件的完整构建链路:sciter 图形库与 vcpkg 媒体编解码栈(libvpx/libyuv/opus/aom)如何就位、各 Linux 发行版的依赖安装命令、Fedora 上 libvpx 的 -fPIC 修补方法,以及基于 Dockerfile 与 entrypoint.sh 的容器化构建流程。读完本文,你可以从零开始在本机或 Docker 中编译出可运行的 rustdesk 二进制。
版本与适用前提
- 当前仓库版本为 1.4.9,要求 Rust 工具链版本不低于 1.75(
rust-version = "1.75",见 Cargo.toml 第 3~9 行)。 - 桌面版使用 sciter 作为图形界面引擎,需要随构建产物一起分发 sciter 动态库;移动端(Android/iOS)走 Flutter 工程,不在本文范围内。
- 本文所有命令均以仓库根目录(README.md 所在目录)为工作目录执行,这是官方文档明确强调的前提,否则应用可能找不到所需资源。
- 构建贡献规范可另见 docs/CONTRIBUTING.md。
构建依赖:sciter 与 vcpkg 媒体栈
RustDesk 的构建依赖分为两部分,二者缺一不可。
sciter 图形动态库
桌面版本使用 sciter 作为 UI 框架。构建时需要按平台获取对应的 sciter 动态库并放入输出目录(Linux x64 下即 target/debug/libsciter-gtk.so)。主工程通过 sciter-rs 依赖加载该库(非 Android/iOS 平台,见 Cargo.toml 第 96 行 sciter-rs 条目),因此动态库缺失会直接导致链接或运行失败。
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 看,实际声明的依赖比 README 命令更多,还包括 libjpeg-turbo、ffmpeg(按平台开启 amf/nvcodec/qsv 硬件编码 feature)、Intel mfx-dispatch、cpu-features(Android 平台)与 Windows ARM64 下的 libsodium。这些依赖通过 manifest 模式由 vcpkg 自动解析;仓库还通过 overlay-ports 指向 res/vcpkg 目录下的自维护端口(aom、ffmpeg、libvpx、libyuv、mfx-dispatch、opus 的 portfile 与补丁集),并通过 overlay-triplets 指向 res/vcpkg-triplets 提供的 Android triplet,锁定的 baseline 为 9e593bb18ea69cc5095e012465dcd675a822ed0d。也就是说,README 中的四个包是最小命令集,完整依赖以 vcpkg.json 为准。
快速构建步骤(Raw Steps)
原文档给出的最短路径构建流程:
- 准备 Rust 开发环境与 C++ 构建环境(
cc、g++等,仓库根目录的 build.rs 会通过cccrate 编译平台相关的 C/C++ 源码,Windows 下编译src/platform/windows.cc,macOS 下编译src/platform/macos.mm); - 安装 vcpkg 并正确设置
VCPKG_ROOT环境变量; - 按上节命令安装 vcpkg 包;
- 运行
cargo run。
Linux 发行版依赖安装
不同发行版的系统级依赖包名不同,以下命令逐条继承自原文档,可直接复制执行。
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
这些包大体对应三大用途:编译器与构建工具(gcc/g++、nasm/yasm、cmake)、X11/Wayland 显示相关开发库(libxcb、libxdo、libxfixes、libxcb-*)、音频库(libasound2、libpulse、alsa-lib)。对照 Dockerfile 第 6~33 行可以看到,容器构建在 Debian bullseye 上安装的正是同一套包,另加 libgstreamer1.0-dev、ninja-build 等,可视为 Ubuntu 命令超集。
安装 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
注意官方明确要求 git checkout 2023.04.15——该版本号同时出现在 Dockerfile 第 42 行的 git clone --branch 2023.04.15 中,说明构建链对该 vcpkg 版本有实际约束,不要随意换用新版 vcpkg。
Fedora 下的 libvpx 修补
Fedora 构建 libvpx 静态库时缺少 -fPIC,会导致后续链接失败。官方给出的修复流程是在 vcpkg 源码树中手工重编并把产物拷回安装目录:
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 生成的 Makefile 的 CFLAGS/CXXFLAGS 注入 -fPIC,重编后把 libvpx.a 覆盖到 vcpkg 安装目录,其余依赖不受影响。
本机最终构建流程
完成系统依赖与 vcpkg 准备后,原文档的完整构建序列为:
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
要点解析:
mkdir -p target/debug与把libsciter-gtk.so移入target/debug是 Linux 桌面版运行的前置条件,因为运行时按输出目录查找 sciter 库;VCPKG_ROOT=$HOME/vcpkg cargo run通过环境变量把 vcpkg 安装根目录传给构建脚本,manifest 模式据此解析依赖;- 编译产物启用 LTO、
codegen-units = 1、panic = "abort"与strip(Cargo.toml 第 245~251 行的[profile.release]),因此--release构建的二进制更小但编译更慢。
Docker 容器化构建
当本机环境难以凑齐全部系统依赖时,仓库提供了 Dockerfile 构建的官方构建容器。
构建构建容器
git clone https://github.com/rustdesk/rustdesk
cd rustdesk
docker build -t "rustdesk-builder" .
该 Dockerfile 以 debian:bullseye-slim 为基座,依次完成:安装上文 Ubuntu 一节的系统依赖(加 GStreamer、ninja 等)、源码编译 CMake 3.30.6、按 2023.04.15 分支克隆并 bootstrap vcpkg(附带 VCPKG_FORCE_SYSTEM_BINARIES=1 环境变量以走系统编译器)、安装 libvpx/libyuv/opus/aom、下载 libsciter-gtk.so、以及安装 rustup。
运行构建
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:.../cargo/git与-v rustdesk-registry-cache:.../cargo/registry:两个命名卷缓存 crate 依赖,首次构建较慢,之后显著提速;-e PUID/-e PGID:让容器内非 root 用户与宿主机 UID/GID 对齐,避免产物文件属主混乱。
entrypoint 对参数的处理
容器入口脚本 entrypoint.sh 会解析追加的参数:
- 追加
--release:脚本会把libsciter-gtk.so拷入target/release/,并以 release 模式构建,最终产物为target/release/rustdesk; - 追加
--target <triple>:先执行rustup target add <triple>再构建,用于交叉编译; - 不追加时默认 debug 构建,产物为
target/debug/rustdesk。
实际执行的最终命令是 VCPKG_ROOT=/vcpkg cargo build --locked $argv(entrypoint.sh 第 36 行),即固定 vcpkg 根目录为容器内路径 /vcpkg 并锁定 Cargo.lock。原文档还特别提醒:cargo install、cargo run 等子命令在此方案下不受支持,因为它们会在容器内部执行而非宿主机;构建完成后可在仓库根目录直接运行:
target/debug/rustdesk # debug 版
# 或
target/release/rustdesk # release 版
仓库文件结构速览
原文档最后给出核心模块地图,这里转为仓库内相对路径并补充说明(与 Cargo.toml 第 211 行 workspace members 一致):
| 模块 | 职责 |
|---|---|
| libs/hbb_common | 视频编解码封装、配置、tcp/udp 封装、protobuf、文件传输 fs 函数及其他工具函数 |
| libs/scrap | 屏幕采集(X11/Wayland/quartz/dxgi/drm 等后端,见 libs/scrap/src/common) |
| libs/enigo | 平台相关的键盘/鼠标控制,按 linux/macos/win 分目录实现 |
| src/ui | sciter 图形界面(HTML/CSS/TIS 模板 + Rust 侧处理) |
| src/server | 音频/剪贴板/输入/视频服务与网络连接 |
| src/client.rs | 发起对端连接 |
| src/rendezvous_mediator.rs | 与 rendezvous 服务器通信,等待远程直连(TCP 打洞)或中继连接 |
| src/platform | 平台相关代码(Windows/macOS/Linux 权限、服务、剪贴板等) |
构建时 build.rs 还会按目标平台自动选择编译 C/C++ 源文件并生成版本号信息,这与上文“准备 C++ 构建环境”的要求直接对应。
小结
RustDesk 的构建难度主要集中在两点:一是 vcpkg 版本钉在 2023.04.15 且依赖 manifest 与 overlay 端口,本机构建务必按序执行“系统依赖 → vcpkg → 四件套”;二是 sciter 动态库必须手动放入 target/{debug,release}。若环境受限,直接使用 rustdesk-builder 镜像配合两个 cargo 缓存卷是最省事的路线,--release 与 --target 参数覆盖常见编译场景。
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