news 2026/9/6 20:44:31

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RustDesk 源码编译指南:vcpkg 依赖、Linux 发行版适配与 Docker 容器化构建

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

【免费下载链接】rustdeskAn open-source remote desktop application designed for self-hosting, as an alternative to TeamViewer.项目地址: https://gitcode.com/GitHub_Trending/ru/rustdesk

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 安装命令
Windowsvcpkg install libvpx:x64-windows-static libyuv:x64-windows-static opus:x64-windows-static aom:x64-windows-static
Linux / MacOSvcpkg 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版本(与仓库 Dockerfile 中git 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.rs 由build = "build.rs"指定)会依据它查找 vcpkg 安装的静态库;
  • 可执行入口为 src/main.rs,crate 默认运行目标为rustdesk(Cargo.toml 中default-run = "rustdesk"),另有naming(src/naming.rs)与service(src/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.toml 的hwcodecvramdrmmediacodec等 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 或flutterfeature 下不启用 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-builderDocker 镜像完成容器化构建——即可在本机得到target/debug/rustdesktarget/release/rustdesk。若后续要深入理解某一子系统,可按“文件结构”一节的模块划分,从 libs/hbb_common、libs/scrap、src/server 与 src/rendezvous_mediator.rs 入手阅读。RustDesk 欢迎社区贡献,翻译与维护相关说明可参考 docs/CONTRIBUTING.md。

【免费下载链接】rustdeskAn open-source remote desktop application designed for self-hosting, as an alternative to TeamViewer.项目地址: https://gitcode.com/GitHub_Trending/ru/rustdesk

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/6 20:43:24

FLOW3D多孔介质模型与渗流模拟:从参数原理到工程应用解析

简介&#xff1a;这份FLOW-3D多孔介质模型渗流模型PPT&#xff0c;是一份面向CFD工程师、水利与环境研究人员及FLOW-3D初学者的中文技术讲稿&#xff0c;聚焦流体在砂石、毛细孔、管束等多孔介质中的渗流模拟难题。内容从达西定律入手&#xff0c;系统讲解FLOW-3D拖曳力模型的数…

作者头像 李华
网站建设 2026/9/6 20:39:43

零碳智慧园区数字化节能监管管控平台建设方案深度拆解

简介&#xff1a;一套完整的零碳智慧园区数字化节能监管管控平台建设方案&#xff0c;正文共326页、逾12万字&#xff0c;适合园区能源管理负责人、智慧园区方案规划师、系统集成商及节能改造项目技术人员使用。方案内容覆盖建设背景、用能现状&#xff08;用电、用水、用能安全…

作者头像 李华
网站建设 2026/9/6 20:39:30

微课制作全流程:从选题设计到成片包装的获奖实战指南

简介&#xff1a;2022年中国大学生计算机设计大赛微课类中南赛区一等奖的教学文档&#xff0c;围绕破伤风诊疗技能与临床思维训练虚拟仿真教学系统展开。文档共1个PDF文件&#xff0c;大小5.18MB&#xff0c;涵盖教学目标、教学设计、教学素材、教学反思、练习测试与学生反馈等…

作者头像 李华
网站建设 2026/9/6 20:38:16

基于MATLAB/Simulink的输电线路故障仿真建模与分析方法

简介&#xff1a;面向电力系统专业学生与工程技术人员的MATLAB/SIMULINK输电线路故障仿真分析文档&#xff0c;重点讲解短路故障的建模与仿真方法。内容从短路故障类型、MATLAB/SIMULINK基础入手&#xff0c;系统梳理短路计算原理与步骤&#xff0c;并给出三相短路系统仿真模型…

作者头像 李华
网站建设 2026/9/6 20:38:12

MATLAB/Simulink输电线路故障仿真全流程实战解析

简介&#xff1a;这份基于MATLAB的输电线路故障仿真分析文档&#xff0c;面向电力系统相关专业学生、研究人员及工程技术人员&#xff0c;系统梳理短路故障原理与仿真建模方法。内容以MATLAB/SIMULINK为工具&#xff0c;从短路故障分类、计算原理讲到三相短路系统仿真模型搭建&…

作者头像 李华
网站建设 2026/9/6 20:36:58

MIDAS Civil几何刚度初始荷载与初拉力:索结构稳定分析的关键

简介&#xff1a;数学建模学习方法系列中的一份PDF资料&#xff0c;围绕MIDAS程序中几何刚度初始荷载与初拉力的功能展开&#xff0c;面向结构工程领域的工程师与建模分析人员&#xff0c;旨在厘清这两个易混淆概念在不同分析场景下的作用与区别。资源为单个PDF文档&#xff0c…

作者头像 李华