RustDesk 从源码构建完全指南:vcpkg 依赖、Linux 编译与 Docker 容器化构建
本文以 RustDesk 仓库内的官方构建文档(docs/README-CS.md 所对应的 README 构建章节)为核心,系统讲解 RustDesk 远程桌面应用的源码编译全流程:从 Rust/C++ 工具链准备、vcpkg 媒体编解码依赖安装,到 Ubuntu/Fedora/Arch 三大 Linux 发行版的依赖配置、libvpx 补丁修复,再到基于 Docker 的容器化构建。读完本文,你可以独立在 Linux 主机上完成 RustDesk 的 debug/release 构建,并理解各依赖(libvpx、libyuv、opus、aom)在项目中承担的媒体处理职责。
项目定位与软件组件依赖
RustDesk 是一个用 Rust 编写的开源远程桌面应用,定位为可自托管的 TeamViewer 替代品:开箱即用、数据掌握在自己手中,既可以使用公共 relay 服务器,也可以自建或自行开发 rendezvous/relay 服务器。
要理解为什么构建 RustDesk 如此“重”,先看它的桌面端 UI 与移动端 UI 的技术选型:
- 桌面端:GUI 基于 sciter(一个独立的脚本化 UI 引擎)。因此构建前必须下载与平台对应的 sciter 运行时库:
- Windows:
sciter.dll - Linux:
libsciter-gtk.so(从 sciter-sdk 的bin.lnx/x64/下载) - MacOS:
libsciter.dylib
- Windows:
- 移动端:使用 Flutter 框架,源码位于 flutter 目录(Android/iOS 原生壳在 flutter/android 与 flutter/ios,Dart 业务代码在 flutter/lib),桌面端 UI 也在逐步向 Flutter 迁移(Cargo.toml 中已有
flutter = ["flutter_rust_bridge"]特性开关)。
sciter-rs 依赖(sciter-rs crate)通过 git 引入,且仅在非 Linux/Android/iOS 目标的桌面构建中使用 GTK 版 sciter 库时,Linux 构建步骤需要手工把 libsciter-gtk.so 拷贝到 target/debug,正是因为 Cargo 不会替你下载这个二进制。
快速构建步骤(跨平台概览)
按官方文档,最简构建路径只有三步:
- 准备好 Rust 与 C++ 开发环境;
- 安装 vcpkg 并正确设置环境变量
VCPKG_ROOT,然后按平台安装 C++ 依赖:- 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。
这四大依赖各自的角色(结合仓库源码可以确认):
- libvpx:VP8/VP9 编解码,对应 libs/scrap/src/common/vpx.rs 与 vpxcodec.rs;
- aom:AV1 编解码,对应 libs/scrap/src/common/aom.rs;
- opus:音频编码,音频服务在 src/server/audio_service.rs;
- libyuv:YUV 色彩空间转换,用于视频帧格式转换(libs/scrap/src/common/convert.rs 链路)。
需要注意,仓库根目录的 vcpkg.json 声明的完整依赖集比上面四条命令更多——它还包含 cpu-features(Android)、libjpeg-turbo、libsodium(Windows arm64)、mfx-dispatch(Intel QSV 硬编解码),以及按平台/特性条件引入的 ffmpeg(含 amf、nvcodec、qsv 等硬解特性)。同时 vcpkg.json 通过 overlay-ports 指向 res/vcpkg 目录:仓库内自带了 aom、ffmpeg、libvpx、libyuv、opus、mfx-dispatch 等 port 的定制补丁(例如 res/vcpkg/aom 中的 AVX2 补丁),overlay-triplets 指向 res/vcpkg-triplets 的 Android triplet 配置。这意味着用 vcpkg install 构建时,实际生效的是仓库定制过的 port 与补丁,而非 vcpkg 上游原版。
另外,Cargo.toml 中定义了若干与媒体捕获相关的编译特性,可按需追加:hwcodec(硬编解码)、vram(显存直读)、mediacodec(Android MediaCodec)、drm(Linux DRM 捕获)等,它们分别透传给 scrap crate 的对应特性。
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
这些系统包覆盖了 sciter-gtk 所需的 GTK3/X11 扩展(libxcb-*、libxfixes)、libxdo(底层键鼠控制,与 libs/enigo/src/linux/xdo.rs 对应)、音频栈(ALSA/PulseAudio/PipeWire)以及汇编器(nasm/yasm,vcpkg 编译 libvpx 时需要)。
vcpkg 安装与依赖构建
官方文档推荐的 vcpkg 安装方式(锁定版本 2023.04.15,与 Dockerfile 保持一致):
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
VCPKG_ROOT 指向 vcpkg 根目录后,cargo 构建脚本才能在链接期找到已安装的 C 库。
libvpx 补丁修复(Fedora)
在 Fedora 上,libvpx 的 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
即重新 configure 后,用 sed 给 Makefile 注入 -fPIC 标志,手动 make 并把产物 libvpx.a 复制回 vcpkg 的 installed 目录,供后续链接使用。
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
要点:
- 通过 rustup 安装工具链(Cargo.toml 声明
rust-version = "1.75",即最低要求 Rust 1.75); - 必须把
libsciter-gtk.so放到target/debug,否则运行时桌面 UI 加载失败; VCPKG_ROOT以内联环境变量的方式传给cargo run,等效于前面的 export。
构建产物为 target/debug/rustdesk;发布构建(cargo build --release 或 cargo run --release)产物在 target/release/rustdesk。注意应用需要从仓库根目录运行,否则可能找不到所需资源文件。
Docker 容器化构建
对于不想污染宿主环境的开发者,仓库提供了官方 Dockerfile,基于 debian:bullseye-slim,镜像内预装了:
- 与 Ubuntu 章节一致的 C/C++/GTK/X11/音频系统包,外加
libssl-dev、gstreamer、ninja-build; - 源码编译安装的 CMake 3.30.6;
- 锁定 2023.04.15 版本的 vcpkg(设置
VCPKG_FORCE_SYSTEM_BINARIES=1),并预装libvpx libyuv opus aom; - 下载好的
libsciter-gtk.so(置于/home/user); - 非 root 用户
user,rustup 工具链以该用户身份安装。
构建镜像:
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
各参数含义:
-v $PWD:/home/user/rustdesk:把工作区挂载进容器,编译产物直接落在宿主机当前目录;- 两个命名卷
rustdesk-git-cache/rustdesk-registry-cache:缓存 cargo 的 git 依赖与 crates 索引,首次构建较慢,后续复用缓存显著加速; PUID/PGID:让容器内user的 UID/GID 与宿主一致,避免产物文件属主错乱。
容器的入口脚本 entrypoint.sh 做了几件关键的事,正好解释了文档中提到的两个注意事项:
- 自动进入
$HOME/rustdesk并 source cargo 环境; - 解析命令行:遇到
--release就创建target/release并把libsciter-gtk.so拷入该目录;遇到--target <triple>会自动rustup target add; - 其余参数原样传给最终的
VCPKG_ROOT=/vcpkg cargo build --locked $argv。
因此:
- 追加
--release可构建发布版,例如docker run ... rustdesk-builder --release; - 产物路径为
target/debug/rustdesk或target/release/rustdesk,务必从仓库根目录启动,否则可能找不到资源; - 文档同时提醒:
cargo install、cargo run等子命令不通过该方式支持,因为那会在容器内部安装/运行程序而非宿主机上——entrypoint 固定执行cargo build --locked,也印证了这一点。
仓库目录结构速览
官方文档给出的核心目录结构如下(均对应仓库中真实存在的路径):
- libs/hbb_common:视频编解码封装、配置、tcp/udp 封装、协议缓冲区、文件传输的文件系统函数及其他基础支撑(当前检出中该目录为占位/子模块,源码以 git 依赖形式参与构建);
- libs/scrap:屏幕捕获,含各平台后端——x11、wayland、quartz(macOS)、dxgi(Windows)、android,以及通用编解码模块 libs/scrap/src/common;
- libs/enigo:跨平台键鼠模拟(linux、macos、win 三套实现);
- src/ui:sciter 桌面端 UI(index/remote/cm 等 HTML+TIS 模板与 Rust 宿主);
- src/server:服务端各服务——音视频(video_service.rs、audio_service.rs)、剪贴板(clipboard_service.rs)、输入(input_service.rs)、显示(display_service.rs)等;
- src/client.rs:发起与被端(peer)的连接;
- src/rendezvous_mediator.rs:与自建/公共 rustdesk-server 通信,等待直连(TCP 打洞)或中继(relay)连接;
- src/platform:平台相关代码(Linux 权限、macOS、Windows 服务、ACL 等);
- flutter:移动端 Flutter 应用源码。
小结
RustDesk 的源码构建本质上由三条线构成:系统包线(GTK/X11/音频/汇编器)、vcpkg 媒体库线(libvpx/libyuv/opus/aom 及仓库内 overlay 定制补丁)、Rust 工具链线(rustup 1.75+ 与 sciter 运行时)。Linux 原生构建按发行版安装依赖后,VCPKG_ROOT=... cargo run 即可;追求环境隔离则使用仓库自带的 Dockerfile + entrypoint.sh,以挂载工作区 + cargo 缓存卷的方式把 cargo build --locked 跑在容器里,产物直接落回宿主机。构建时可按需叠加 Cargo.toml 中的 hwcodec、drm 等特性来启用硬编解码与 DRM 捕获等进阶能力。
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 StartedRust0623
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