RustDesk 源码构建实战:Linux 依赖准备、vcpkg 媒体库与 Docker 容器化构建全流程
本篇指南基于 RustDesk 仓库的构建文档(波斯语版 README 与主 README),系统讲解如何从零开始为 RustDesk 准备 Rust + C++ 交叉构建环境:安装 Sciter 动态库与 vcpkg 媒体编解码依赖(libvpx / libyuv / opus / aom)、在 Ubuntu / Fedora / Arch 三大发行版上完成原生构建,以及使用仓库自带的 Dockerfile 与 entrypoint 脚本做容器化构建。读完本文,你可以独立完成 RustDesk 的 debug/release 可执行文件构建,理解其目录结构中各核心模块(屏幕采集、键鼠控制、服务器服务、rendezvous 协调等)的职责划分。
一、文档定位:RustDesk 构建指南与项目概览
本文依据的关联文档是 docs/README-FA.md,它是仓库主 README.md 的波斯语翻译版,内容与主 README 保持同步,涵盖依赖说明、构建需求、Linux 构建步骤、Docker 构建与目录结构等章节。RustDesk 是一款使用 Rust 语言编写的开源远程桌面软件,支持自托管部署,是 TeamViewer 的替代方案:既可以连接官方提供的 rendezvous/relay 服务器,也可以自建或自行编写 rendezvous/relay 服务。从 Cargo.toml 可以看到当前仓库版本为 1.4.9,Rust 语言版本要求为 1.75。
关于翻译协作,文档明确说明:RustDesk 的界面语言文件位于 src/lang 目录(含 en.rs、cn.rs、fa.rs 等 40 余种语言),需要社区协助将 README、UI 与文档翻译成更多母语。
二、GUI 依赖:Sciter 动态库与 Flutter 双轨路线
桌面版的 GUI 实现历史上采用 Sciter,移动端(及正在迁移的桌面端)采用 Flutter。文档中给出的构建教程以 Sciter 为主线,因为对新手更友好。
Sciter 动态库需要自行下载并放到构建输出目录:
| 平台 | 动态库文件 |
|---|---|
| Windows | sciter.dll(x64) |
| Linux | libsciter-gtk.so(x64) |
| macOS | libsciter.dylib |
仓库中 Sciter 的加载来自 Cargo.toml 的 sciter-rs 依赖(仅在非移动端启用);而 flutter 目录包含了完整的 Flutter 前端代码(lib/ 下按 desktop/、mobile/、web/、models/ 等分层组织),通过 flutter_rust_bridge = "=1.80" 与 Rust 核心通信,对应 Cargo feature 开关 flutter = ["flutter_rust_bridge"]。主 README 还注明 Flutter 版本的构建方式可参考 CI 配置,Sciter UI(src/ui 目录)在最新仓库中已标记为 deprecated,正在向 Flutter 迁移。
三、构建需求:Rust + C++ 环境与四大 vcpkg 媒体库
RustDesk 的屏幕编码与音频采集依赖 C/C++ 原生库,必须通过 vcpkg 统一安装并正确设置环境变量 VCPKG_ROOT:
- Rust 开发环境:通过 rustup 安装稳定版工具链;
- C++ 构建环境:g++ / clang / cmake / nasm / yasm 等;
- vcpkg:安装后需导出
VCPKG_ROOT指向其根目录; - 四个核心 vcpkg 包:
# Windows(静态库三元组)
vcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static
# macOS / Linux
vcpkg install libvpx libyuv opus aom
这四个库的分工可从仓库源码结构印证:
- libvpx(VP8/VP9)与 aom(AV1):屏幕视频编码,对应 libs/scrap 中的
vpxcodec.rs、aom.rs等模块; - opus:音频采集编码,对应音频服务 src/server/audio_service.rs;
- libyuv:YUV 像素格式转换,用于采集到的屏幕帧在编码前的色彩空间转换。
仓库根目录的 vcpkg.json 进一步声明了完整的依赖清单,包括 libjpeg-turbo、mfx-dispatch(Intel QSV 硬件编码)、ffmpeg(Windows / Linux x86_64 / macOS 静态链接时启用,带 amf / nvcodec / qsv 硬件加速 feature),并通过 overlay-ports 指向 res/vcpkg 目录下的自维护端口定义(ffmpeg、libvpx、aom、opus 等均有定制补丁),通过 overlay-triplets 指向 res/vcpkg-triplets 中的 Android 专用三元组文件。
四、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
各依赖的作用:libgtk-3-dev(Sciter GTK 后端)、libxdo-dev / libxcb-*-dev(X11 键鼠注入与窗口管理,被 libs/enigo 的 Linux 后端 libs/enigo/src/linux/xdo.rs 使用)、libasound2-dev / libpulse-dev(ALSA 与 PulseAudio 音频采集)、nasm / yasm(汇编器,编译 libvpx 等 C 库时使用)。
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
安装并固定版本的 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
文档明确要求将 vcpkg 检出到 2023.04.15 标签,以保证端口定义与构建脚本兼容——仓库根 Dockerfile 中同样使用 --branch 2023.04.15 --depth=1 克隆 vcpkg,两处版本必须保持一致,否则可能出现端口配置不匹配。
Fedora 上的 libvpx 修复(-fPIC)
Fedora 下 vcpkg 构建 libvpx 时可能因缺少位置无关代码(PIC)标志而失败,文档给出的修复方案是手动进入构建树、给 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
拉取源码并构建
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
要点:libsciter-gtk.so 必须与可执行文件同目录(target/debug),运行时 Sciter 引擎通过动态库查找机制加载它;VCPKG_ROOT 用于让构建脚本定位 vcpkg 安装的头文件与静态库。构建成功后直接运行 cargo run 即可启动本机的服务端 + 客户端进程。
五、Docker 容器化构建
对于不想在宿主机污染工具链的开发者,仓库提供了 Dockerfile 与 entrypoint.sh 组成的一键构建方案。
构建构建镜像
git clone https://github.com/rustdesk/rustdesk
cd rustdesk
docker build -t "rustdesk-builder" .
从 Dockerfile 的构建过程看,镜像基于 debian:bullseye-slim,依次完成:安装与 Ubuntu 章节完全对齐的 apt 依赖(g++、nasm、yasm、libgtk-3-dev、libxcb-*-dev、libasound2-dev 等,另加 libgstreamer 开发库与 ninja-build);源码编译 CMake 3.30.6;以 2023.04.15 分支克隆并 bootstrap vcpkg,安装 libvpx libyuv opus aom;预下载 libsciter-gtk.so;创建非特权用户 user(/home/user);最后以该用户安装 rustup。环境变量 VCPKG_FORCE_SYSTEM_BINARIES=1 则让 vcpkg 复用系统的 cmake/ninja。
执行构建
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/下;- 两个 named volume 分别缓存 cargo 的 git 依赖与 registry 依赖,首次构建较慢,后续构建显著提速;
PUID/PGID:以宿主机当前用户的 UID/GID 运行,保证生成的target/文件归宿主用户所有,避免容器内 root 属主问题。
entrypoint 脚本的参数处理逻辑
entrypoint.sh 是容器的 ENTRYPOINT,其逻辑为:
- 进入
$HOME/rustdesk并 source~/.cargo/env; - 扫描命令行参数:遇到
--release时把预置的libsciter-gtk.so复制到target/release/并标记release=1;遇到--target <triple>时自动执行rustup target add以支持交叉编译目标;其余参数原样保留; - 未标记 release 时,把 Sciter 动态库复制到
target/debug/; - 最终以
VCPKG_ROOT=/vcpkg cargo build --locked $argv执行构建(--locked保证使用锁定的 Cargo.lock 版本)。
因此,若要构建优化版本,只需在命令末尾追加 --release:
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 --release
运行产物
target/debug/rustdesk # debug 版本
target/release/rustdesk # release 版本
文档特别强调:两条命令必须从 RustDesk 仓库根目录执行,否则程序找不到所需资源文件;此外 cargo install、cargo run 等其他 cargo 子命令目前不受该容器方式支持——因为程序是在容器内而非宿主机上安装/运行的。
六、目录结构:从源码印证各模块职责
文档给出的目录结构表是理解 RustDesk 代码组织的关键入口,结合当前仓库逐一印证如下:
| 目录 / 文件 | 职责 |
|---|---|
| libs/hbb_common | 视频编码封装、配置(config)、tcp/udp 封装、protobuf、文件传输用的 fs 函数及其他工具函数。是 client 与 server 共享的公共基础库,如 src/rendezvous_mediator.rs 从 hbb_common 引入 socket_client、rendezvous_proto、UDP FramedSocket 等 |
| libs/scrap | 屏幕采集。src/common/ 下按平台拆分 x11.rs、wayland.rs、quartz.rs、dxgi.rs、linux.rs 等采集后端,另有 vpxcodec.rs、aom.rs 编码封装 |
| libs/enigo | 平台特定的键盘 / 鼠标控制。src/linux/(xdo.rs、nix_impl.rs)、src/macos/、src/win/ 分别实现三大平台的输入注入 |
| libs/clipboard | Windows / Linux / macOS 的剪贴板(含文件复制粘贴)实现,Linux 后端位于 libs/clipboard/src/platform/unix |
| src/ui | Sciter GUI(HTML/CSS/TS 混合编写,如 cm.html、remote.tis、index.css),在最新仓库中已标记 deprecated |
| src/server | 服务端各服务:音频(audio_service.rs)、剪贴板(clipboard_service.rs)、输入(input_service.rs)、视频(video_service.rs、display_service.rs)及网络连接管理(connection.rs) |
| src/client.rs | 发起对端(peer)连接。核心入口 Client::start 定义于该文件 L181,视频/音频线程启动函数 start_video_thread、start_audio_thread 亦在此文件 |
| src/rendezvous_mediator.rs | 与 rendezvous/relay 服务器通信,负责设备注册(register_pk)、等待远端直连(TCP hole punching)或中转连接的协调逻辑,全文约千行 |
| src/platform | 平台特定代码,含 windows/(ACL、MSI 注册表、设备管理)、linux.rs、macos.mm 等 |
| flutter | 移动端(及桌面迁移中)的 Flutter 代码,lib/ 下按 desktop/、mobile/、web/ 分平台组织页面与模型 |
从源码结构看,一次完整的连接流程大致为:客户端 UI(Flutter 或 Sciter)调用 src/client.rs 发起连接 → src/rendezvous_mediator.rs 通过 UDP 与 rendezvous 服务器交换密钥并协商出直连或中转地址 → 服务端 src/server 的视频服务用 libs/scrap 采集屏幕并经 libvpx/aom 编码推送,输入服务通过 libs/enigo 反向注入键鼠事件。
七、常用 Cargo feature 开关(补充)
除文档给出的基础构建命令外,Cargo.toml 还定义了若干可选 feature,用于按需裁剪构建能力:
hwcodec(scrap 硬件编码)、vram(显存读取)、mediacodec(Android MediaCodec)、drm/drm-wake(Linux DRM 采集及显示器唤醒)、flutter(启用 Flutter 桥接,移动端必选)、linux-pkg-config(Linux 下用 pkg-config 查找 opus/scrap 依赖)。
这些开关对应文档中"如需为构建命令指定不同参数,可在命令末尾通过 <OPTIONAL-ARGS> 传入"的说明,例如 cargo build --features flutter 用于构建 Flutter 版桌面端。
八、小结
本文以 docs/README-FA.md(主 README 的波斯语版)为骨架,结合仓库内 Dockerfile、entrypoint.sh、vcpkg.json、Cargo.toml 及 libs、src 目录的实际实现,完整覆盖了 RustDesk 构建的关键链路:Sciter 动态库准备、vcpkg 固定版本与四大媒体库安装、三大发行版依赖清单、Fedora libvpx 的 -fPIC 修复、容器化构建的参数化用法,以及各核心模块的职责划分。遵循这些步骤,即可在当前仓库(v1.4.9)上完成从源码到可执行文件的完整构建。
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 StartedRust0624
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