news 2026/9/5 20:17:09

RustDesk 编译实战指南:vcpkg 依赖安装、Docker 容器化构建与源码结构解析

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RustDesk 编译实战指南:vcpkg 依赖安装、Docker 容器化构建与源码结构解析

RustDesk 编译实战指南:vcpkg 依赖安装、Docker 容器化构建与源码结构解析

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

本篇指南围绕 RustDesk 仓库的官方构建文档(docs/README-PTBR.md,该文档是仓库 README 的葡语版本,构建流程与其他语言版 README 一致)展开,覆盖从零编译 RustDesk 的完整流程:各 Linux 发行版的系统依赖安装、vcpkg 编解码库准备、Sciter/Flutter 双 GUI 体系说明、Docker 容器化构建,以及仓库源码结构。读完本文,你能够独立在裸机或容器中完成 RustDesk 的可执行文件构建,并理解VCPKG_ROOT等构建变量在源码构建脚本中是如何被消费的。

适用范围与前置条件

按构建文档说明,桌面版使用FlutterSciter(已标记为 discontinued/不推荐)作为图形界面。文档中给出的快速上手路径以 Sciter 为准,因为它更简单、更易起步;Flutter 版本的编译方式参见仓库 CI 配置。

准备开发环境需要做三件事:

  1. 准备好 Rust 开发环境(rustup)和 C++ 编译工具链(gcc/g++、clang 等);
  2. 安装 vcpkg(以源码仓库形式安装即可)并正确设置环境变量VCPKG_ROOT
  3. 按平台安装编解码依赖:
    • 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
  4. Sciter 版还需要自行下载对应平台的 Sciter 动态库:Windows 为sciter.dll、Linux 为libsciter-gtk.so、macOS 为libsciter.dylib(来自 c-smile/sciter-sdk 发布资源)。

一个值得注意的版本前提:当前仓库 Cargo.toml 声明的rust-version1.75,包版本为1.4.9,即建议至少使用 Rust 1.75 及以上工具链来编译本仓库代码。

vcpkg 依赖声明与源码的对应关系

文档只要求安装libvpx libyuv opus aom四个库,但仓库根目录的 vcpkg.json 实际上声明了更完整的依赖集合,其中包含:

  • libvpxlibyuvopusaom(均声明host: truehost: false两份,分别用于构建宿主与目标平台);
  • libjpeg-turbo(静态截图/图像编码路径使用);
  • mfx-dispatch(Intel QSV 硬件编解码,限定windows | (x86/x64 linux)平台);
  • ffmpeg(限定静态构建平台,并在 Windows/Linux 下启用amfnvcodecqsv等硬件编码 feature);
  • 通过overlay-ports指向仓库内 res/vcpkg 目录下的定制端口(仓库自带 aom/ffmpeg/libvpx/libyuv/opus/mfx-dispatch 的补丁与 portfile),并通过overlay-triplets指向 res/vcpkg-triplets,baseline则把依赖版本固定在一个提交上,保证可复现构建。

VCPKG_ROOT在哪里被消费?这正是文档反复强调设置该变量的原因。从源码结构看:

  • 屏幕捕获库的构建脚本 libs/scrap/build.rs 中的find_package()函数定义了三级查找策略:若处于 Linux 且启用了linux-pkg-configfeature,优先走 pkg-config(可用NO_PKG_CONFIG_<lib>=1关闭);否则读取VCPKG_ROOT环境变量,从$VCPKG_ROOT/installed/<triplet>/lib输出cargo:rustc-link-search与静态库链接指令,并用 bindgen 基于 vcpkg 头文件生成 FFI 绑定;两者都失败时,仅 macOS aarch64 允许回退 Homebrew(源码中直接panic!("Couldn't find VCPKG_ROOT, also can't fallback to homebrew because it's only for macos aarch64."))。
  • 顶层 build.rs 在为 Android 目标编译时,同样依赖VCPKG_ROOT(或VCPKG_INSTALLED_ROOT)来定位交叉编译产物目录并链接 NDK 兼容库。

因此“正确设置VCPKG_ROOT”不是可选建议,而是构建脚本解析编解码库链接路径的硬依赖。

安装系统级依赖(按发行版)

以下是构建文档给出的各发行版依赖安装命令,与 Dockerfile 中实际安装的系统包高度一致(gcc/g++、git、nasm、yasm、libgtk-3-dev、clang、libxcb-*-dev、libxdo-dev、libxfixes-dev、libasound2-dev、libpulse-dev、cmake、make、libgstreamer1.0-dev 等),可互为印证。

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

openSUSE Tumbleweed

sudo zypper install gcc-c++ git curl wget nasm yasm gcc gtk3-devel clang libxcb-devel libXfixes-devel \ cmake alsa-lib-devel gstreamer-devel gstreamer-plugins-base-devel xdotool-devel

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 gstreamer1-devel gstreamer1-plugins-base-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

这些依赖分别服务于:屏幕捕获(xcb/Xfixes)、输入模拟(libxdo)、音频采集(ALSA/PulseAudio)、GTK 窗口(Sciter 依赖 libgtk-3)、GStreamer 管线(macOS 之外的音频重定向等场景)。

安装 vcpkg

构建文档固定了 vcpkg 的 checkout 版本(与 Dockerfile 中--branch 2023.04.15 --depth=1保持一致):

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.json 中baseline固定的提交与仓库内 res/vcpkg overlay 端口(例如 aom 补丁、libvpx 的 UWP 支持补丁)是按同一时期的 vcpkg 行为编写的,随意升级 vcpkg 可能破坏 overlay 端口的构建。

修复 Fedora 上 libvpx 的 -fPIC 问题

在 Fedora 上编译时,vcpkg 为 libvpx 生成的 Makefile 默认不带-fPIC,会导致静态库无法链接进最终二进制。构建文档给出如下修复流程(进入 vcpkg 构建目录,手动重编并拷回已安装目录):

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

该问题的本质与 libs/scrap/build.rs 的链接方式直接相关:Rust 侧以cargo:rustc-link-lib=static=...方式链接 vcpkg 产出的静态库,静态库中的目标文件必须开启位置无关代码(PIC)才能被链入动态链接的最终可执行文件;Fedora 的工具链对缺省 PIC 行为的处理与其他发行版不同,因而出现该差异。

编译 RustDesk(Sciter GUI)

完整的裸机编译流程(构建文档“Compilar”一节):

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh source $HOME/.cargo/env git clone --recurse-submodules https://gitcode.com/GitHub_Trending/ru/rustdesk cd rustdesk mkdir -p target/debug # 下载 Linux x64 版 Sciter 动态库(Windows/macOS 请按平台替换文件名) 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

要点说明:

  • --recurse-submodules不可省略,仓库依赖 git 子模块;
  • libsciter-gtk.so必须放在可执行文件同目录(target/debug),运行时按相对路径加载——这一点在 Docker 构建入口脚本 entrypoint.sh 中被自动化处理(test -f target/debug/libsciter-gtk.so || cp ...);
  • 需要 release 优化版本时,在命令后追加--release,产物位于target/release/rustdesk

从 Cargo.toml 的 features 定义可以看到更多可定制的构建维度,例如flutter(启用 Flutter GUI 的flutter_rust_bridge依赖)、hwcodec(硬件编解码,透传scrap/hwcodec)、drm/drm-wake(DRM 屏幕捕获及其“显示唤醒”子开关)、linux-pkg-config(Linux 下改用 pkg-config 而非 vcpkg 查找依赖)等。release profile 启用了ltocodegen-units = 1panic = 'abort'strip,即正式构建产物经过体积与性能优化。

使用 Docker 编译

Docker 方式把上述全部环境(bullseye 基础镜像 + 系统依赖 + vcpkg 2023.04.15 + Sciter 库 + rustup)封装进构建容器,宿主机只需保留 Docker。

首先克隆仓库并构建构建器镜像:

git clone https://gitcode.com/GitHub_Trending/ru/rustdesk cd rustdesk git submodule update --init --recursive docker build -t "rustdesk-builder" .

Dockerfile 的关键步骤:基于debian:bullseye-slim安装与上文 Ubuntu 段落相同的系统依赖,从 CMake 3.30.6 源码安装 CMake,克隆 vcpkg 的 2023.04.15 分支并install libvpx libyuv opus aom(设置VCPKG_FORCE_SYSTEM_BINARIES=1),下载libsciter-gtk.so,安装 rustup,并以非特权用户运行。

之后每次编译执行:

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-cache/rustdesk-registry-cache让后续构建复用 crate 缓存,显著提速;
  • 需要附加 cargo 参数时直接追加在命令末尾,例如--release编译优化版本;
  • 最终产物仍生成在宿主机的target目录:debug 版运行target/debug/rustdesk,release 版运行target/release/rustdesk

入口脚本 entrypoint.sh 解释了参数是如何被处理的:它逐参扫描--release(置位 release 并把 Sciter 库拷入target/release)与--target <triple>(调用rustup target add注册交叉编译目标),其余参数原样透传,最终统一执行:

VCPKG_ROOT=/vcpkg cargo build --locked $argv

这带来两个实用约束,构建文档也特别提示:

  1. 必须从仓库根目录运行可执行文件,否则应用可能找不到所需资源;
  2. 该容器化方法不支持cargo installcargo run等子命令语义——entrypoint 固定调用cargo build,即只把程序“构建”出来放到宿主机的target目录,而非在容器内安装或运行。

源码结构

构建文档最后给出了仓库核心目录的职责划分,结合 Cargo.toml 中 workspace members 的定义(libs/scraplibs/hbb_commonlibs/enigolibs/clipboardlibs/virtual_displaylibs/portablelibs/remote_printer)可以更清楚地理解模块边界:

  • libs/hbb_common:视频编解码封装、配置、TCP/UDP 网络封装层、protobuf、文件传输用的文件系统函数及其他通用工具;
  • libs/scrap:屏幕捕获。其内部按平台拆分(src/common/下有 x11、wayland、quartz、dxgi、mediacodec、drm 等捕获后端,src/bindings/存放 aom/vpx/yuv 的 FFI 头文件,由 libs/scrap/build.rs 用 bindgen 生成 Rust 绑定);
  • libs/enigo:各平台键盘/鼠标控制(linux/macos/win 三套实现 + 统一 DSL 接口);
  • libs/clipboard:Windows、Linux、macOS 的文件与文本剪贴板实现(含 Windows 的wf_cliprdr.cCliprDr 协议);
  • src/ui:旧版 Sciter 界面代码(tis/html/css,文档已注明该方向不推荐,新版 GUI 在 flutter 目录);
  • src/server:音频、剪贴板、输入、视频等服务以及网络连接处理(audio_service.rsinput_service.rsvideo_service.rsconnection.rs等);
  • src/client.rs:发起直接连接(peer connection);
  • src/rendezvous_mediator.rs:与自建 rendezvous/relay 服务器通信,等待直接连接(TCP 打洞)或中继连接;
  • src/platform:各平台特化代码(Linux 权限提升、macOS 特权脚本、Windows 服务与安装器等);
  • flutter:桌面与移动端的 Flutter 客户端代码(Dart 层 + 各平台壳工程)。

另外,Cargo.toml 还通过[patch.crates-io]libxdo-sys替换为仓库内的 libs/libxdo-sys-stub,使系统在未安装 libxdo(例如纯 Wayland 环境)时也能完成构建与运行——这与上文 Arch 段落依赖列表中出现xdotool但 Wayland 用户可缺省的场景相呼应。

构建排障小结

综合构建文档与源码,常见问题可归纳为:

现象可能原因与处理
构建脚本 panic 提示找不到VCPKG_ROOT未设置或 shell 未 export;设置VCPKG_ROOT指向 vcpkg 根目录后重试(见 libs/scrap/build.rs)
Fedora 上 libvpx 链接报 undefined symbol / 无法生成最终二进制静态库缺-fPIC,按上文 sed 修复流程重编libvpx.a并拷回installed/x64-linux/lib
cargo build报链接错误指向 aom/libvpx/opus检查vcpkg install的 triplet 是否与VCPKG_ROOT/installed下实际产物一致;Docker 方式可整体规避
运行target/debug/rustdesk提示缺少 Sciter 库libsciter-gtk.so放到可执行文件同目录,并从仓库根目录启动
Docker 中cargo run/cargo install不生效entrypoint 只执行cargo build,参数透传规则见 entrypoint.sh

按以上步骤,你可以在 Ubuntu、openSUSE、Fedora、Arch 等主流发行版(或直接用 Docker)上完成 RustDesk 的完整构建,并通过--release获得经过 LTO 优化的发行级二进制。

【免费下载链接】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/5 20:15:26

AS3游戏编程实战:构建低延迟射击游戏的五层架构

简介&#xff1a;本资源是面向游戏开发初学者与Flash技术进阶者的ActionScript 3.0互动游戏编程实践套件&#xff0c;聚焦RIA时代经典游戏逻辑实现与交互设计能力培养。压缩包共964个文件&#xff0c;涵盖649个核心AS类文件&#xff08;含角色控制、碰撞检测、状态机、Tween动画…

作者头像 李华
网站建设 2026/9/5 20:13:57

激光送丝3D打印三大误区:近净成形不是最终成形

很多工程师第一次接触激光送丝 3D 打印时&#xff0c;关注点往往都在激光功率、送丝速度、路径规划这些操作层参数上。真正等到样件出来才发现&#xff0c;问题不是设备跑不动&#xff0c;而是前期对工艺的定位就偏了&#xff1a;有人以为打印完就能直接装配&#xff0c;有人只…

作者头像 李华
网站建设 2026/9/5 20:09:59

有线耳机音质优势与无损音频检测:参数解析到命令行实战

前几天整理歌单时&#xff0c;我突然意识到一件事&#xff1a;我最常单曲循环的几位歌手里&#xff0c;Julia Michaels 占了很大比例&#xff1b;而我最常用的听歌设备&#xff0c;不是各种新出的蓝牙耳机&#xff0c;而是一条压箱底的有线耳机。身边不少同事觉得这个组合有点“…

作者头像 李华