ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

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

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 仓库中的官方构建文档 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.md 与 docs/README-ID.md开箱即用无需额外配置即可连接数据完全由自己掌控可自建 rendezvous/relay会合/中继服务器也可使用官方服务器或自行编写会合/中继服务桌面端 GUI 使用 Sciter 或 Flutter 实现跨 Windows / Linux / macOS并有 Android / iOS / Web 端。本仓库的构建文档英文 README.md、印尼语 docs/README-ID.md 等 20 语言版本同时承担着两个角色一是用户下载预编译二进制之外的源码构建教程二是贡献者进入代码库前的结构导览。下文所有命令与配置均以当前仓库rustdeskcrate 版本 1.4.9Rust 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 中的flutterfeature。若走 Sciter 路线需要自行下载 Sciter 动态库并按平台放置文档给出的下载源为 c-smile/sciter-sdk 官方发行件平台动态库文件放置位置Linux 构建流程中Windowssciter.dll可执行文件同目录Linuxlibsciter-gtk.sotarget/debug/见下文 Build 步骤macOSlibsciter.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-turbo、libsodiumWindows ARM64mfx-dispatch与带amf/nvcodec/qsvfeature 的ffmpeg用于 x86/x64 平台的硬件编解码对应 Cargo.toml 中hwcodec、vram、mediacodec等 feature 门控vcpkg-configuration中通过overlay-ports: ./res/vcpkg与overlay-triplets: ./res/vcpkg-triplets引用了仓库自带的定制端口与 Android tripletres/vcpkg-triplets/下含arm-neon-android.cmake、arm64-android.cmake等这解释了 res/vcpkg/ 下大量针对 aom/ffmpeg/libvpx 的补丁文件。最小启动步骤环境Rust 工具链 C 编译环境 vcpkg就绪后文档给出的最小路径只有一条命令cargo runLinux 下的完整构建流程文档按发行版给出了系统包清单全部保留如下可直接复制执行。1. 安装系统依赖Ubuntu 18 / Debian 10sudo 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-devFedora 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从包清单可以读出构建环境的硬性要求clangRust FFI 绑定如libxdo-sys需要 Clang 解析系统头文件、libgtk-3-devLinux 桌面窗口与 Sciter 集成、libxdo-dev/xdotool键鼠控制对应libs/enigo的 Linux 实现、libasound2-dev/libpulse-dev音频服务、nasm/yasmaom/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 aomgit 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两个容易踩坑的细节libsciter-gtk.so必须提前放进target/debug/——Sciter 库不是 crate 依赖而是运行时由进程加载的动态库Cargo 不会替你处理因此文档用mkdir -pmv显式放置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主程序另含naming、service两个辅助 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-dev、libxdo-dev、libpulse-dev、libgstreamer1.0-dev等见 Dockerfile源码编译 CMake 3.30.6Dockerfile固定 vcpkg2023.04.15并预装libvpx libyuv opus aom同时设置VCPKG_FORCE_SYSTEM_BINARIES1Dockerfile预下载libsciter-gtk.so到/home/userDockerfile创建非 root 用户useruid 1000与docker run时注入的PUID/PGID配合。入口脚本 entrypoint.sh 负责真正的构建其逻辑值得逐行看entrypoint.sh遍历docker run追加的参数遇到--release时置标志位并把libsciter-gtk.so复制到target/release/遇到--target triple时调用rustup target add即文档所说的“在OPTIONAL-ARGS位置追加参数”debug 构建则把 Sciter 库复制到target/debug/最终以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 install、cargo run等子命令不可用——程序会在容器内而非宿主机安装/运行entrypoint 也只会透传给cargo build。此外 release profile 在 Cargo.toml 中开启了lto true、codegen-units 1、panic abort、strip true所以 release 构建耗时长但产物小且紧凑这也解释了“首次构建慢”的官方提示。仓库代码结构导览文档 “File Structure” 一节是理解 RustDesk 代码组织的入口结合 Cargo.toml 的 workspace 成员声明libs/scrap、libs/hbb_common、libs/enigo、libs/clipboard、libs/virtual_display、libs/portable、libs/remote_printer可还原如下结构路径职责libs/hbb_common公共基础设施视频 codec 封装、配置读写、tcp/udp wrapper、protobuf 协议定义、文件传输用的 fs 函数等git 子模块libs/scrap屏幕采集screen capture按平台分为 x11/wayland/quartz/dxgi 等后端支持 hwcodec、vram、drm 等 featurelibs/enigo平台相关的键盘/鼠标控制Linux 基于 xdo/nixmacOS/Windows 各自实现libs/clipboard跨平台Windows/Linux/macOS剪贴板与文件复制粘贴实现src/ui已弃用的 Sciter GUIHTML/TIS 模板 Rust 绑定如 cm.html、remote.htmlsrc/server服务端五大服务audio/clipboard/input/video service、显示服务与网络连接管理service.rs、video_service.rs 等src/client.rs发起对被端peer的连接src/rendezvous_mediator.rs与 rustdesk-server会合/中继服务器通信等待直连TCP 打洞或中继连接建立src/platform平台特有代码windows/macos/linux 子目录含权限脚本、特权提升等flutter桌面与移动端的 Flutter UIDart 代码 各平台壳工程见 flutter/pubspec.yaml补充两个与本文档语言版本相关的细节UI 多语言由 src/lang/ 下的逐语言文件维护印尼语对应 src/lang/id.rsdocs/README-ID.md 顶部的翻译招募说明即指向这些文件src/server/ 中还包含文档未展开的终端服务terminal_service.rs等较新模块结构清单可视为“主干导览”而非全量清单。小结构建路径选择只想快速跑起来按“最小启动步骤”装好 Rust C 环境 vcpkg 四件套cargo run宿主机环境脏、不想污染系统优先 Docker 方案镜像已固化 vcpkg2023.04.15、CMake 3.30.6 与 Sciter 动态库配合 cargo 缓存卷实现增量快速构建需要深入修改先读libs/hbb_common协议与配置、libs/scrap采集编码、src/rendezvous_mediator.rs连接建立三条主线再进入src/server各服务。参考文档与源码入口docs/README-ID.md、README.md、Dockerfile、entrypoint.sh、vcpkg.json、Cargo.toml。【免费下载链接】rustdeskAn open-source remote desktop application designed for self-hosting, as an alternative to TeamViewer.项目地址: https://gitcode.com/GitHub_Trending/ru/rustdesk创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表