首页
/ RustDesk 源码构建实战:vcpkg 依赖准备、Linux 编译流程与 Docker 构建详解

RustDesk 源码构建实战:vcpkg 依赖准备、Linux 编译流程与 Docker 构建详解

2026-09-05 22:58:59作者:毕习沙Eudora

本文基于 RustDesk 仓库中的官方构建文档 docs/README-ID.md 及其对应的英文主文档 README.md 展开,系统讲解 RustDesk 桌面版从源码构建的完整链路:GUI 运行时与 vcpkg 四大核心编解码依赖(libvpx、libyuv、opus、aom)、Ubuntu/Fedora/Arch 三类发行版下的编译环境准备、Docker 容器化构建方案,以及 libs/src/ 目录的代码结构脉络。读完本文,你可以独立在本地或容器内完成 RustDesk 的 debug/release 构建并定位关键源码模块。

项目背景与文档定位

RustDesk 是一个用 Rust 编写的开源远程桌面程序,面向自托管(self-hosting)场景,定位为 TeamViewer 的替代方案。其核心卖点(见 README.mddocs/README-ID.md):

  • 开箱即用,无需额外配置即可连接;
  • 数据完全由自己掌控,可自建 rendezvous/relay(会合/中继)服务器,也可使用官方服务器或自行编写会合/中继服务;
  • 桌面端 GUI 使用 Sciter 或 Flutter 实现,跨 Windows / Linux / macOS,并有 Android / iOS / Web 端。

本仓库的构建文档(英文 README.md、印尼语 docs/README-ID.md 等 20+ 语言版本)同时承担着两个角色:一是用户下载预编译二进制之外的源码构建教程,二是贡献者进入代码库前的结构导览。下文所有命令与配置均以当前仓库(rustdesk crate 版本 1.4.9,Rust 1.75+,见 Cargo.toml)实际内容为准。

构建依赖:GUI 运行时与 vcpkg 四大核心库

GUI 运行时:Sciter 或 Flutter

桌面版的图形界面有两种技术路线(docs/README-ID.md “Dependensi” 一节):

  • Sciter:传统 GUI 方案,实现位于 src/ui/(Sciter 模板 + Rust 脚本绑定)。英文 README.md 补充说明该方案已被标记为 deprecated,官方教程仍以 Sciter 为准,因为上手更简单;
  • Flutter:当前桌面与移动端共用的 UI 框架,Dart 代码位于 flutter/ 目录,Rust 侧通过 flutter_rust_bridge 桥接(Cargo.toml 中的 flutter feature)。

若走 Sciter 路线,需要自行下载 Sciter 动态库并按平台放置(文档给出的下载源为 c-smile/sciter-sdk 官方发行件):

平台 动态库文件 放置位置(Linux 构建流程中)
Windows sciter.dll 可执行文件同目录
Linux libsciter-gtk.so target/debug/(见下文 Build 步骤)
macOS libsciter.dylib 可执行文件同目录

vcpkg:音频与视频编解码依赖

C/C++ 依赖统一通过 Microsoft vcpkg 管理,文档要求安装 vcpkg 并正确设置环境变量 VCPKG_ROOT。核心依赖是四个编解码库,按平台分别安装(Windows 需静态链接 triplet):

# 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

四个库在 RustDesk 中的分工可以从源码结构对应上:libvpx/aom 是 VP8/VP9 与 AV1 视频编码器(libs/scrap 的屏幕采集编码路径),libyuv 负责帧格式转换,opus 负责音频编码(src/server/audio_service.rs 使用)。

当前仓库根目录的 vcpkg manifest vcpkg.json 还声明了更完整的依赖集,说明实际 CI/移动端构建比“最小四件套”更多:

  • libjpeg-turbolibsodium(Windows ARM64);
  • mfx-dispatch 与带 amf/nvcodec/qsv feature 的 ffmpeg,用于 x86/x64 平台的硬件编解码(对应 Cargo.tomlhwcodecvrammediacodec 等 feature 门控);
  • vcpkg-configuration 中通过 overlay-ports: ./res/vcpkgoverlay-triplets: ./res/vcpkg-triplets 引用了仓库自带的定制端口与 Android triplet(res/vcpkg-triplets/ 下含 arm-neon-android.cmakearm64-android.cmake 等),这解释了 res/vcpkg/ 下大量针对 aom/ffmpeg/libvpx 的补丁文件。

最小启动步骤

环境(Rust 工具链 + C++ 编译环境 + vcpkg)就绪后,文档给出的最小路径只有一条命令:

cargo run

Linux 下的完整构建流程

文档按发行版给出了系统包清单,全部保留如下,可直接复制执行。

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

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

从包清单可以读出构建环境的硬性要求:clang(Rust FFI 绑定如 libxdo-sys 需要 Clang 解析系统头文件)、libgtk-3-dev(Linux 桌面窗口与 Sciter 集成)、libxdo-dev/xdotool(键鼠控制,对应 libs/enigo 的 Linux 实现)、libasound2-dev/libpulse-dev(音频服务)、nasm/yasm(aom/libvpx 汇编构建)、libgstreamer1.0-dev(屏幕/音频采集管线)。

2. 安装并配置 vcpkg

# 从 Microsoft 官方仓库克隆 vcpkg(微软 vcpkg 项目)
git clone <vcpkg 官方仓库地址> vcpkg
cd vcpkg
git checkout 2023.04.15        # 文档固定版本基线,与 Dockerfile 中一致
cd ..
vcpkg/bootstrap-vcpkg.sh
export VCPKG_ROOT=$HOME/vcpkg
vcpkg/vcpkg install libvpx libyuv opus aom

git checkout 2023.04.15 不是可选项:Docker 构建文件 Dockerfile 中同样固定了 --branch 2023.04.15,保证宿主机手工构建与容器构建使用同一份端口定义,避免端口升级导致编译失败。

3. Fedora 下 libvpx 的 -fPIC 修复

文档给出了 Fedora 特有的手工修复步骤(vcpkg 构建的 libvpx 静态库缺 -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 后向 CFLAGS/CXXFLAGS 注入 -fPIC,手工编译并把手工产物 libvpx.a 覆盖回 vcpkg 的 installed/x64-linux/lib/ 目录。

4. 克隆仓库、放置 Sciter 库并构建

# 使用 rustup 安装 Rust 工具链(rustup 官方安装脚本)
curl --proto '=https' --tlsv1.2 -sSf <rustup 安装脚本地址> | sh
source $HOME/.cargo/env

git clone https://gitcode.com/GitHub_Trending/ru/rustdesk
cd rustdesk
mkdir -p target/debug
# 从 Sciter SDK 下载 Linux 动态库
wget <sciter-sdk 的 libsciter-gtk.so 发行地址>
mv libsciter-gtk.so target/debug
VCPKG_ROOT=$HOME/vcpkg cargo run

两个容易踩坑的细节:

  1. libsciter-gtk.so 必须提前放进 target/debug/——Sciter 库不是 crate 依赖,而是运行时由进程加载的动态库,Cargo 不会替你处理,因此文档用 mkdir -p + mv 显式放置;
  2. libs/hbb_common 是 git 子模块(仓库根 .gitmodules 指向 rustdesk/hbb_common 仓库),英文 README.md 的 Docker 章节因此要求克隆时加 --recurse-submodules 或克隆后执行 git submodule update --init --recursive,否则 hbb_common 目录为空、cargo run 会因找不到路径依赖而失败。

cargo run 会构建 Cargo.toml 中声明的 default-run = "rustdesk" 主程序(另含 namingservice 两个辅助 bin)。

Docker 方式构建

Docker 方案把整套 Linux 环境固化进镜像,宿主只需 Docker。流程分两步:

第一步:构建构建镜像

git clone https://gitcode.com/GitHub_Trending/ru/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:把宿主仓库目录挂到容器内工作目录(/home/user/rustdesk);
  • -v rustdesk-git-cache:...-v rustdesk-registry-cache:...:两个命名卷缓存 cargo 的 git 依赖与 registry 依赖,首次构建慢、后续构建快的关键;
  • -e PUID/PGID:注入宿主用户 ID,使容器内生成的 target/ 文件属主与宿主一致,避免后续 sudo 改属主。

结合 Dockerfile 与 entrypoint.sh 看构建细节

对照 Dockerfile 可以验证镜像内容与文档声明完全一致:

  • 基础镜像 debian:bullseye-slim,安装与 Ubuntu 清单同源的编译依赖(libgtk-3-devlibxdo-devlibpulse-devlibgstreamer1.0-dev 等,见 Dockerfile);
  • 源码编译 CMake 3.30.6(Dockerfile);
  • 固定 vcpkg 2023.04.15 并预装 libvpx libyuv opus aom,同时设置 VCPKG_FORCE_SYSTEM_BINARIES=1Dockerfile);
  • 预下载 libsciter-gtk.so/home/userDockerfile);
  • 创建非 root 用户 user(uid 1000),与 docker run 时注入的 PUID/PGID 配合。

入口脚本 entrypoint.sh 负责真正的构建,其逻辑值得逐行看(entrypoint.sh):

  1. 遍历 docker run 追加的参数:遇到 --release 时置标志位并把 libsciter-gtk.so 复制到 target/release/;遇到 --target <triple> 时调用 rustup target add(即文档所说的“在 <OPTIONAL-ARGS> 位置追加参数”);
  2. debug 构建则把 Sciter 库复制到 target/debug/
  3. 最终以 VCPKG_ROOT=/vcpkg cargo build --locked $argv 收尾——--locked 保证按 Cargo.lock 精确复现依赖版本。

因此文档中“追加 --release 构建优化版”的用法,实际生效链路是:docker run ... rustdesk-builder --release → entrypoint 复制动态库到 target/release/cargo build --locked --release。构建产物直接落在宿主机(因为源码目录被挂载):

target/debug/rustdesk     # debug 构建
target/release/rustdesk   # release 构建

两点使用限制(文档明确提示,源码同样印证):

  • 必须从 RustDesk 仓库根目录运行,否则应用找不到所需资源(如 res/ 下的图标、语言文件);
  • 容器方式下 cargo installcargo run 等子命令不可用——程序会在容器内而非宿主机安装/运行,entrypoint 也只会透传给 cargo build

此外 release profile 在 Cargo.toml 中开启了 lto = truecodegen-units = 1panic = 'abort'strip = true,所以 release 构建耗时长但产物小且紧凑,这也解释了“首次构建慢”的官方提示。

仓库代码结构导览

文档 “File Structure” 一节是理解 RustDesk 代码组织的入口,结合 Cargo.toml 的 workspace 成员声明(libs/scraplibs/hbb_commonlibs/enigolibs/clipboardlibs/virtual_displaylibs/portablelibs/remote_printer)可还原如下结构:

路径 职责
libs/hbb_common 公共基础设施:视频 codec 封装、配置读写、tcp/udp wrapper、protobuf 协议定义、文件传输用的 fs 函数等(git 子模块)
libs/scrap 屏幕采集(screen capture),按平台分为 x11/wayland/quartz/dxgi 等后端,支持 hwcodec、vram、drm 等 feature
libs/enigo 平台相关的键盘/鼠标控制(Linux 基于 xdo/nix,macOS/Windows 各自实现)
libs/clipboard 跨平台(Windows/Linux/macOS)剪贴板与文件复制粘贴实现
src/ui 已弃用的 Sciter GUI(HTML/TIS 模板 + Rust 绑定,如 cm.htmlremote.html
src/server 服务端五大服务:audio/clipboard/input/video service、显示服务与网络连接管理(service.rsvideo_service.rs 等)
src/client.rs 发起对被端(peer)的连接
src/rendezvous_mediator.rs 与 rustdesk-server(会合/中继服务器)通信,等待直连(TCP 打洞)或中继连接建立
src/platform 平台特有代码(windows/macos/linux 子目录,含权限脚本、特权提升等)
flutter 桌面与移动端的 Flutter UI(Dart 代码 + 各平台壳工程,见 flutter/pubspec.yaml

补充两个与本文档语言版本相关的细节:UI 多语言由 src/lang/ 下的逐语言文件维护(印尼语对应 src/lang/id.rs),docs/README-ID.md 顶部的翻译招募说明即指向这些文件;src/server/ 中还包含文档未展开的终端服务(terminal_service.rs)等较新模块,结构清单可视为“主干导览”而非全量清单。

小结:构建路径选择

  • 只想快速跑起来:按“最小启动步骤”装好 Rust + C++ 环境 + vcpkg 四件套,cargo run
  • 宿主机环境脏、不想污染系统:优先 Docker 方案,镜像已固化 vcpkg 2023.04.15、CMake 3.30.6 与 Sciter 动态库,配合 cargo 缓存卷实现增量快速构建;
  • 需要深入修改:先读 libs/hbb_common(协议与配置)、libs/scrap(采集编码)、src/rendezvous_mediator.rs(连接建立)三条主线,再进入 src/server 各服务。

参考文档与源码入口:docs/README-ID.mdREADME.mdDockerfileentrypoint.shvcpkg.jsonCargo.toml

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