首页
/ RustDesk 源码构建实战:Linux 依赖准备、vcpkg 媒体库与 Docker 容器化构建全流程

RustDesk 源码构建实战:Linux 依赖准备、vcpkg 媒体库与 Docker 容器化构建全流程

2026-09-04 21:53:52作者:龚格成

本篇指南基于 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.rscn.rsfa.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.tomlsciter-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.rsaom.rs 等模块;
  • opus:音频采集编码,对应音频服务 src/server/audio_service.rs
  • libyuv:YUV 像素格式转换,用于采集到的屏幕帧在编码前的色彩空间转换。

仓库根目录的 vcpkg.json 进一步声明了完整的依赖清单,包括 libjpeg-turbomfx-dispatch(Intel QSV 硬件编码)、ffmpeg(Windows / Linux x86_64 / macOS 静态链接时启用,带 amf / nvcodec / qsv 硬件加速 feature),并通过 overlay-ports 指向 res/vcpkg 目录下的自维护端口定义(ffmpeglibvpxaomopus 等均有定制补丁),通过 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 容器化构建

对于不想在宿主机污染工具链的开发者,仓库提供了 Dockerfileentrypoint.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,其逻辑为:

  1. 进入 $HOME/rustdesk 并 source ~/.cargo/env
  2. 扫描命令行参数:遇到 --release 时把预置的 libsciter-gtk.so 复制到 target/release/ 并标记 release=1;遇到 --target <triple> 时自动执行 rustup target add 以支持交叉编译目标;其余参数原样保留;
  3. 未标记 release 时,把 Sciter 动态库复制到 target/debug/
  4. 最终以 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 installcargo run 等其他 cargo 子命令目前不受该容器方式支持——因为程序是在容器内而非宿主机上安装/运行的。

六、目录结构:从源码印证各模块职责

文档给出的目录结构表是理解 RustDesk 代码组织的关键入口,结合当前仓库逐一印证如下:

目录 / 文件 职责
libs/hbb_common 视频编码封装、配置(config)、tcp/udp 封装、protobuf、文件传输用的 fs 函数及其他工具函数。是 client 与 server 共享的公共基础库,如 src/rendezvous_mediator.rshbb_common 引入 socket_clientrendezvous_proto、UDP FramedSocket 等
libs/scrap 屏幕采集。src/common/ 下按平台拆分 x11.rswayland.rsquartz.rsdxgi.rslinux.rs 等采集后端,另有 vpxcodec.rsaom.rs 编码封装
libs/enigo 平台特定的键盘 / 鼠标控制。src/linux/xdo.rsnix_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.htmlremote.tisindex.css),在最新仓库中已标记 deprecated
src/server 服务端各服务:音频(audio_service.rs)、剪贴板(clipboard_service.rs)、输入(input_service.rs)、视频(video_service.rsdisplay_service.rs)及网络连接管理(connection.rs
src/client.rs 发起对端(peer)连接。核心入口 Client::start 定义于该文件 L181,视频/音频线程启动函数 start_video_threadstart_audio_thread 亦在此文件
src/rendezvous_mediator.rs 与 rendezvous/relay 服务器通信,负责设备注册(register_pk)、等待远端直连(TCP hole punching)或中转连接的协调逻辑,全文约千行
src/platform 平台特定代码,含 windows/(ACL、MSI 注册表、设备管理)、linux.rsmacos.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 的波斯语版)为骨架,结合仓库内 Dockerfileentrypoint.shvcpkg.jsonCargo.tomllibssrc 目录的实际实现,完整覆盖了 RustDesk 构建的关键链路:Sciter 动态库准备、vcpkg 固定版本与四大媒体库安装、三大发行版依赖清单、Fedora libvpx 的 -fPIC 修复、容器化构建的参数化用法,以及各核心模块的职责划分。遵循这些步骤,即可在当前仓库(v1.4.9)上完成从源码到可执行文件的完整构建。

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