首页
/ RustDesk 源码编译指南:vcpkg 依赖、Linux 发行版适配与 Docker 容器化构建

RustDesk 源码编译指南:vcpkg 依赖、Linux 发行版适配与 Docker 容器化构建

2026-09-05 22:59:59作者:柏廷章Berta

RustDesk 是一款用 Rust 编写的开源远程桌面应用,开箱即用、无需额外配置,适合自托管部署并作为 TeamViewer 的替代方案。本文围绕官方仓库文档(原文为 docs/README-EO.md,中文可读 docs/README-ZH.md)完整讲解从依赖准备、跨平台编译命令、Linux 各发行版适配,到 Docker 容器化构建的全流程,并结合仓库源码剖析 RustDesk 的目录结构与核心模块职责,帮助你从零开始成功编译出自己的可执行文件。

项目概览:用 Rust 编写的自托管远程桌面

RustDesk 的核心卖点是数据完全由用户掌控:你可以直接连接对方,也可以使用官方的 rendezvous(会合)/relay(中继)服务器、配置自己的服务器,或参考 rustdesk-server-demo 自行编写会合/中继服务器。

从仓库 Cargo.toml 可以确认当前源码版本为 1.4.9,要求 Rust 1.75+rust-version = "1.75"),并且这是一个 cargo workspace——除主 crate 外,还包含 8 个本地库成员:

[workspace]
members = [
    "libs/scrap", "libs/hbb_common", "libs/enigo", "libs/clipboard",
    "libs/virtual_display", "libs/virtual_display/dylib",
    "libs/portable", "libs/remote_printer"
]

另外,桌面版的图形界面基于 sciter 引擎,因此编译/运行前需要下载 sciter 的动态库(Windows 为 sciter.dll,Linux 为 libsciter-gtk.so,macOS 为 libsciter.dylib,可从 sciter-sdk 官方仓库的 bin.win/x64bin.lnx/x64bin.osx 目录获取)。这一点在 Cargo.toml 中也有对应依赖:非移动端目标会链接 sciter-rsbranch = "dyn",即动态加载 sciter)。

跨平台编译步骤

官方文档给出的通用编译步骤只有三步:

  1. 准备好 Rust 开发环境和 C++ 编译环境;
  2. 安装 vcpkg(以文本方式说明:从微软 vcpkg 仓库安装)并正确设置环境变量 VCPKG_ROOT
  3. 执行 cargo run

其中 vcpkg 用于安装四个 C/C++ 原生依赖,且 Windows 与 Linux/macOS 的 triplet(三元组)不同:

平台 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

这四个依赖对应视频/音频编解码栈:libvpx(VP8/VP9)、aom(AV1)、libyuv(像素格式转换)、opus(Opus 音频)。仓库根目录的 vcpkg.json 中声明了 libvpxlibyuvopusaom 等全部二进制依赖,并通过 "overlay-ports": ["./res/vcpkg"] 指向仓库自带的补丁端口 res/vcpkg(内含 aomlibvpxlibyuvopusffmpegmfx-dispatch 的 portfile 与补丁),通过 "overlay-triplets": ["./res/vcpkg-triplets"] 提供 Android 各架构的 triplet 文件(如 res/vcpkg-triplets/x64-android.cmake)。换言之,仓库内的这些 overlay 端口保证了官方 CI 与本地构建使用同一套经过修补的依赖版本。

在 Linux 上编译:发行版依赖包清单

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

这些包分别服务于编译链(g++/gcc/nasm/yasm/cmake)、屏幕捕获(libxcb-* 系列,对应 X11 抓屏)、输入控制(libxdo/xdotool,对应 libs/enigo 的键鼠模拟)与音频(libasound2/libpulse/pipewire,对应服务端音频捕获)。

安装 vcpkg 与 libvpx 的 Fedora 修复

文档指定使用 vcpkg 的 2023.04.15 版本(与仓库 Dockerfilegit clone --branch 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

在 Fedora 上,libvpx 构建出的静态库默认不带 -fPIC,会导致链接失败。文档给出了手动重编译的修复方法(进入 vcpkg 构建目录,为 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

提示:Dockerfile 中设置了 ENV VCPKG_FORCE_SYSTEM_BINARIES=1,让 vcpkg 使用系统自带的构建工具,这是容器环境下减少构建问题的常用做法,手动编译时也可参考。

完整编译命令序列

在依赖就绪后,官方文档给出的 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

几个关键细节:

  • sciter 动态库必须放在可执行文件旁边target/debug/libsciter-gtk.so)。sciter-rs 以动态方式加载它,缺失时界面无法启动;
  • 每次执行 cargo run 前需保证 VCPKG_ROOT 指向 vcpkg 根目录,cargo 的构建脚本(build.rsbuild = "build.rs" 指定)会依据它查找 vcpkg 安装的静态库;
  • 可执行入口为 src/main.rs,crate 默认运行目标为 rustdeskCargo.tomldefault-run = "rustdesk"),另有 namingsrc/naming.rs)与 servicesrc/service.rs)两个辅助二进制。

使用 Docker 编译

对于希望隔离环境的用户,仓库提供官方构建镜像 Dockerfile(基于 debian:bullseye-slim,预装 CMake 3.30.6、vcpkg 2023.04.15 及全部 apt 依赖)。构建与使用方式:

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

要点说明:

  • 两个命名卷rustdesk-git-cacherustdesk-registry-cache)分别缓存 cargo 的 git 依赖与 registry 缓存,首次编译较慢(依赖需要缓存),后续编译显著提速;
  • PUID/PGID 环境变量用于把容器内用户映射到宿主机用户,避免产物文件属主错乱;
  • 容器入口脚本是 entrypoint.sh。阅读其源码可以看到它支持两种附加参数:传 --release 会先 mkdir -p target/release 并把 libsciter-gtk.so 复制到 release 输出目录,最终执行 VCPKG_ROOT=/vcpkg cargo build --locked;传 --target <三元组> 会调用 rustup target add 安装交叉编译目标。未传参数时默认走 debug 构建,同样会把 sciter 库复制到 target/debug/

编译完成后,在仓库根目录下运行:

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

文档特别提示两个限制:其一,务必在 RustDesk 仓库根目录执行,否则程序找不到必要资源;其二,cargo installcargo run 等子命令在该 Docker 方法下暂不支持,因为它们会把安装/运行动作发生在容器内而非宿主机上。

源码结构:核心模块职责拆解

官方文档的“文件结构”一节是理解 RustDesk 架构的地图。对照当前仓库,各模块的实际内容与职责如下:

  • libs/hbb_common:公共底层库。从 src/rendezvous_mediator.rs 的导入可以印证其覆盖面:config(配置与常量,如 RENDEZVOUS_PORTCONNECT_TIMEOUT)、protobuf/rendezvous_proto(消息序列化)、socket_client(TCP/UDP 封装)、udp::FramedSocket 等,是视频编解码工具、配置系统、TCP/UDP 覆盖层与文件传输 fs 函数等公用功能的汇聚点。
  • libs/scrap:屏幕捕获库。其源码按显示后端组织(src/common/ 下含 x11.rswayland.rsdxgi.rsquartz.rsaom.rshwcodec.rsvram.rs 等,并附带独立 libs/scrap/Cargo.toml),主 crate 以 features = ["wayland"] 引用它;仓库顶层还通过 Cargo.tomlhwcodecvramdrmmediacodec 等 feature 门控不同硬编码/VRAM/DRM 路径。
  • libs/enigo:跨平台的键盘/鼠标控制,含 linuxmacoswin 三个平台实现目录(如 libs/enigo/src/linux/mod.rs),并提供 examples/ 下的 keyboard.rsmouse.rstimer.rs 等示例;Linux 端依赖 libxdo(仓库甚至用 libs/libxdo-sys-stub 打补丁以支持无 libxdo 的 Wayland-only 环境)。
  • src/ui:客户端界面(sciter HTML/TIS 脚本 + Rust 后端),包括主界面 index.htmlremote.tis/remote.rscm.html 连接管理器界面等。
  • src/server:被控端服务集合。从目录可见完整的受控侧实现:video_service.rs(视频)、audio_service.rs(音频)、clipboard_service.rs(剪贴板)、input_service.rs(输入)、display_service.rs(显示器)、connection.rs(网络连接)等,与文档描述的“音频/剪贴板/输入/视频服务与网络连接”一一对应。
  • src/client.rs:客户端会话入口,启动与远端的连接。
  • src/rendezvous_mediator.rs:与 rustdesk-server 通信的核心中介,负责注册公钥(SENT_REGISTER_PK)、等待远端直连(TCP 打洞)或中继连接;源码中还有 DEPLOY_RETRY_INTERVAL = 30_000(毫秒)等部署状态退避逻辑,可看出其对服务端 register_pk 流程的重试设计。
  • src/platform:操作系统特定代码,细分为 windows/linux.rsmacos.rs/macos.mmprivileges_scripts/(macOS 安装/卸载守护进程脚本)等;src/lib.rs 按目标平台条件编译这些模块(iOS 不启用 server 与 rendezvous_mediator,Android/iOS 或 flutter feature 下不启用 sciter 版 ui,而改用 flutter/ 目录下的 Flutter 前端)。

编译配置与 Release 优化

Cargo.toml 底部还定义了影响产物质量的重要配置,值得在自编译时了解:

[profile.release]
lto = true
codegen-units = 1
panic = 'abort'
strip = true
rpath = true

即 release 构建启用 LTO、单代码生成单元、abort 式 panic、符号剥离与 rpath,产物更小更紧凑;[profile.dev] 则设为 debug = 1 加快迭代。此外 [features] 提供了 flutterhwcodecdrmdrm-wakescreencapturekitlinux-pkg-config 等开关(例如 drm-wakedrm 捕获之外单独门控“显示唤醒”写入逻辑),可按目标平台裁剪功能后使用 cargo build --features <feature> 构建。

小结

按照本文流程——准备 Rust 1.75+ 与 C++ 工具链、用固定版本的 vcpkg 安装 libvpx/libyuv/opus/aom 四个编解码依赖、补齐对应发行版的系统开发包(Fedora 需额外修复 libvpx 的 -fPIC)、放置 sciter 动态库,再执行 VCPKG_ROOT=... cargo run,或改用仓库自带的 rustdesk-builder Docker 镜像完成容器化构建——即可在本机得到 target/debug/rustdesktarget/release/rustdesk。若后续要深入理解某一子系统,可按“文件结构”一节的模块划分,从 libs/hbb_commonlibs/scrapsrc/serversrc/rendezvous_mediator.rs 入手阅读。RustDesk 欢迎社区贡献,翻译与维护相关说明可参考 docs/CONTRIBUTING.md

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