资讯动态

RustDesk 源码构建实战:vcpkg 原生依赖、Docker 构建与核心模块结构解析

发布时间:2026/9/6 22:10:28 来源:尧图企业网站定制
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 仓库的阿拉伯语版 READMEdocs/README-AR.md整理成文系统讲解 RustDesk 桌面版的源码构建全流程从 sciter 动态库与系统依赖的准备到 vcpkg 安装音视频编码依赖libvpx / libyuv / opus / aom、Linux 发行版适配、Docker 容器化构建再到项目核心目录结构libs/hbb_common、libs/scrap、libs/enigo、src/server等的逐一对照。读完本文你可以在 Ubuntu / Fedora / Arch 或 Docker 环境中从零编译出可运行的rustdesk可执行文件并理解各模块在构建与运行时扮演的角色。一、构建背景RustDesk 的技术栈构成RustDesk 是一个开源的自托管远程桌面应用Remote Desktop for self-hosting主程序完全用 Rust 编写。要构建它需要先理解三个技术要点桌面 GUI 基于 sciter非移动端非 Android/iOS 且未启用 flutter feature 的目标通过sciter-rs绑定加载 sciter 动态库来渲染界面。这一点可以在根 Cargo.toml 中得到印证——[target.cfg(not(any(target_os android, target_os ios))).dependencies]段中声明了sciter-rs依赖构建完成后必须把对应平台的 sciter 动态库放到可执行文件旁边见后文否则运行时会找不到资源。移动端基于 Flutter仓库中的 flutter/ 目录包含lib/下的 Dart 代码与 android/ios 工程承载手机与平板端实现README 也说明了桌面端正在从 sciter 向 Flutter 迁移。音视频编解码依赖 C/C 原生库屏幕视频流的编码依赖 libvpxVP8/VP9、aomAV1、libyuv色彩空间转换与 opus音频这些原生库通过 vcpkg 统一安装这也是构建流程中最容易出错的环节。从根 Cargo.toml 可以看到当前包版本为1.4.9最低 Rust 版本要求为1.75rust-version 1.75构建前请确认工具链满足要求。二、前置依赖sciter 动态库桌面版使用 sciter 作为 GUI 框架需要你自行下载对应平台的动态库并在运行时将其与可执行文件放在同一目录平台动态库文件Windowssciter.dllx64Linuxlibsciter-gtk.sox64macOSlibsciter.dylib官方文档给出了各平台的下载直链sciter-sdk 仓库的bin.win/bin.lnx/bin.osx目录。Docker 构建镜像中这一动作是自动化的Dockerfile 执行了wget .../c-smile/sciter-sdk/master/bin.lnx/x64/libsciter-gtk.so并缓存到用户主目录供后续 entrypoint 复制到target/debug/。三、Linux 各发行版的系统依赖README 按发行版给出了完整的系统包安装命令以下逐一继承并说明用途编译器工具链、X11/Wayland 相关开发头文件、音频库等Ubuntu 18 / Debian 10sudo 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服务于 GTK 依赖sciter 的 GTK 版动态库需要 GTK3 运行库libxcb-*-dev系列与libxdo-dev服务于屏幕捕获与 X11 输入模拟对应 libs/scrap 的 X11 后端与 libs/enigo 的xdo.rs实现libasound2-dev/libpulse-dev服务于 ALSA/PulseAudio 音频路径。Fedora 28 / CentOS 8sudo 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-develArch / Manjarosudo pacman -Syu --needed unzip git cmake gcc curl wget yasm nasm zip make pkg-config clang gtk3 xdotool libxcb libxfixes alsa-lib pipewire可以对照 Dockerfile 看到容器构建走的是与 Ubuntu 一致的 apt 方案并额外安装了libssl-devLinux 目标下 openssl 采用vendored特性见 Cargo.toml、libgstreamer1.0-dev、ninja-build等CMake 则是从源码编译了 3.30.6 版本。四、vcpkg原生编解码依赖的安装标准安装步骤按照 README 的说明需要正确设置VCPKG_ROOT环境变量并安装 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 aomWindows 上使用-statictriplet 意味着以静态库形式链接避免运行时分发 DLL。仓库实际的依赖清单根目录的 vcpkg.json 是 vcpkg 的真实依赖清单manifest 模式其中除 README 提到的四件套外还包含更多项按用途可以这样理解视频编码aom、libvpx均同时声明host: true与host: false前者用于构建期工具链后者用于目标产物色彩转换libyuv音频编码opus图像libjpeg-turbo硬件编码条件依赖ffmpeg在windows | (linux !arm32) | osx且 static 平台下启用并可开启amf/nvcodec/qsvfeature与mfx-dispatchIntel 硬编——对应 Cargo.toml 中的hwcodec/vram编译开关Android 专用cpu-featuresplatform: android。清单还通过vcpkg-configuration把 overlay-ports 指向 res/vcpkg、overlay-triplets 指向 res/vcpkg-triplets前者包含对 aom / ffmpeg / libvpx / libyuv / mfx-dispatch / opus 各端口port的定制补丁例如res/vcpkg/aom/aom-avx2.diff、ffmpeg 的 11 个 patch 文件后者提供x64-android.cmake、arm64-android.cmake等 Android triplet。也就是说直接vcpkg install时这些定制补丁会自动生效这解释了为什么仓库能控制原生库的构建细节。Linux 上按 README 的完整安装流程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注意 README 固定 checkout 到2023.04.15分支Dockerfile 同样使用--branch 2023.04.15 --depth1克隆 vcpkg 并设置VCPKG_FORCE_SYSTEM_BINARIES1两者保持一致可以按此版本锁定依赖以确保构建可复现。Fedora 下的 libvpx 修复README 原始步骤在 Fedora 上直接安装 libvpx 可能因缺少-fPIC导致链接失败README 给出的修复流程是进入 vcpkg 的构建产物目录用sed给 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五、本地完整构建流程README 给出的 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逐步解读rustup安装 Rust 工具链并加载环境克隆仓库后手动创建target/debug并放入libsciter-gtk.so这是桌面版运行的硬要求——程序启动时需要在可执行文件所在目录找到 sciter 动态库src/main.rs 的main会调用core_main::core_main()解析参数后进入ui::start(args)启动 sciter 界面以VCPKG_ROOT指向 vcpkg 目录运行cargo runvcpkg 的 manifest 模式会自动读取 vcpkg.json 完成原生依赖构建与链接。补充说明根 Cargo.toml 除了默认二进制rustdesk外还声明了namingsrc/naming.rs与servicesrc/service.rs两个 bin分别用于命名工具与系统服务[profile.release]Cargo.toml开启了 LTO、strip、codegen-units 1等瘦身优化因此 release 构建更慢但产物更小。常用 feature 包括flutter编译 Flutter 桥接、hwcodec硬件编码、drm/drm-wakeLinux DRM 捕获drm-wake在 drm 之上额外编译显示唤醒代码、mediacodec、screencapturekit等可按平台需求用cargo run --features ...追加。六、Docker 构建方式README 推荐的容器化构建分两步第一步克隆仓库并构建构建镜像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-cache与rustdesk-registry-cache两个命名卷分别缓存 cargo 的 git 依赖与 crates 索引首次构建较慢需存储全部依赖之后构建会明显加快PUID/PGID让容器内产物与宿主机用户权限一致。传递额外构建参数在命令末尾追加参数即可例如构建优化版时追加--release得到的可执行文件位于# 默认debug构建 target/debug/rustdesk # 追加 --release 后 target/release/rustdesk这些行为可以在 entrypoint.sh 中得到源码级印证脚本cd $HOME/rustdesk后逐个解析参数遇到--release时mkdir -p target/release并把libsciter-gtk.so复制过去遇到--target triple时调用rustup target add支持交叉编译最后统一执行VCPKG_ROOT/vcpkg cargo build --locked $argv--locked保证依赖版本与 Cargo.lock 完全一致进一步提升可复现性。README 特别提醒两点注意事项原文继承必须在 RustDesk 仓库根目录下执行上述命令否则应用可能找不到所需资源install、run等子命令当前不支持通过该方式透传因为它们会试图在容器内部安装/运行程序而不是宿主机上。七、文件结构核心模块逐一对照README 的「File structure」一节列出了项目的主要目录结合仓库实际结构对照如下原条目中的 GitHub 路径已转换为仓库内相对路径模块职责README 描述仓库内补充证据libs/hbb_common视频编码、文件传输、tcp/udp、部分其他工具函数与配置根 crate 与其 workspace 均依赖它Cargo.toml同时被用作build-dependenciesCargo.tomllibs/scrap屏幕捕获内部按后端组织src/x11/、src/wayland/、src/dxgi/Windows、src/quartz/macOS、src/common/drm_reader.rs等并提供screenshot.rs、record-screen.rs等示例libs/enigo各平台键盘/鼠标控制分平台实现src/linux/含xdo.rs、src/macos/、src/win/另有跨平台 DSLsrc/dsl.rssrc/ui桌面图形界面sciter包含cm.tis/remote.tis/file_transfer.tis等 TIS 脚本与对应 CSS、HTML以及 src/ui/cm.rs、src/ui/remote.rs 等 Rust 桥接src/server音频/剪贴板/输入/视频等服务与网络连接video_service.rs、audio_service.rs、clipboard_service.rs、input_service.rs、display_service.rs、terminal_service.rs等src/client.rs发起连接配套 src/client/ 目录io_loop.rs、file_trait.rs、screenshot.rs、helper.rssrc/rendezvous_mediator.rs与 rustdesk-server 建连、等待直连或远程打洞TCP hole punching配合stunclient依赖Cargo.toml实现 NAT 类型探测与打洞src/platform各平台特有代码linux.rs、macos.rs、windows.rs、delegate.rs、gtk_sudo.rsLinux 提权等flutter/移动端代码lib/下按desktop/、mobile/、web/、models/、native/组织的 Dart 代码以及 android/ios 平台工程与 flutter/README.md从 Cargo.toml 的 workspace 声明看libs/scrap、libs/hbb_common、libs/enigo、libs/clipboard、libs/virtual_display及其dylib、libs/portable、libs/remote_printer都是工作区成员cargo run在根目录会一并解析它们。此外 Cargo.toml 还通过[patch.crates-io]把libxdo-sys替换为仓库内的 libs/libxdo-sys-stub使得在没有安装 libxdo 的系统例如纯 Wayland 环境也能构建运行——这是对 README 依赖清单之外的一个实用细节。八、小结构建路径选择建议本地开发调试按第三节安装系统包 → 第四节安装 vcpkg 依赖Fedora 用户记得做 libvpx 修复→ 第五节执行cargo run把 sciter 动态库放入target/debug/后即可运行。CI 或无头环境、希望零环境配置直接采用第六节 Docker 方案利用命名卷缓存获得更快的二次构建需要优化版时追加--release。需要硬件编码/Flutter/DRM 等能力在第五节命令基础上按 Cargo.toml 的[features]追加--features组合。参与开发构建与贡献规范可参考 docs/CONTRIBUTING.md多语言界面文案维护在 src/lang/ 目录阿拉伯语即ar.rs。以上所有命令与路径均基于当前仓库的实际文件内容构建前请以 docs/README-AR.md 原文及仓库内 Dockerfile、vcpkg.json、entrypoint.sh 为准核对版本细节尤其是 vcpkg 固定版本2023.04.15与 sciter 动态库的放置位置。【免费下载链接】rustdeskAn open-source remote desktop application designed for self-hosting, as an alternative to TeamViewer.项目地址: https://gitcode.com/GitHub_Trending/ru/rustdesk创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价