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/rustdeskRustDesk 是一款用 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.75rust-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.dllLinux 为libsciter-gtk.somacOS 为libsciter.dylib可从 sciter-sdk 官方仓库的bin.win/x64、bin.lnx/x64、bin.osx目录获取。这一点在 Cargo.toml 中也有对应依赖非移动端目标会链接sciter-rsbranch dyn即动态加载 sciter。跨平台编译步骤官方文档给出的通用编译步骤只有三步准备好 Rust 开发环境和 C 编译环境安装 vcpkg以文本方式说明从微软 vcpkg 仓库安装并正确设置环境变量VCPKG_ROOT执行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-staticLinux / MacOSvcpkg install libvpx libyuv opus aom这四个依赖对应视频/音频编解码栈libvpxVP8/VP9、aomAV1、libyuv像素格式转换、opusOpus 音频。仓库根目录的 vcpkg.json 中声明了libvpx、libyuv、opus、aom等全部二进制依赖并通过overlay-ports: [./res/vcpkg]指向仓库自带的补丁端口 res/vcpkg内含aom、libvpx、libyuv、opus、ffmpeg、mfx-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 cmakeFedora 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-develArch (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_BINARIES1让 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.rscrate 默认运行目标为rustdeskCargo.toml 中default-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-cache、rustdesk-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 install、cargo run等子命令在该 Docker 方法下暂不支持因为它们会把安装/运行动作发生在容器内而非宿主机上。源码结构核心模块职责拆解官方文档的“文件结构”一节是理解 RustDesk 架构的地图。对照当前仓库各模块的实际内容与职责如下libs/hbb_common公共底层库。从 src/rendezvous_mediator.rs 的导入可以印证其覆盖面config配置与常量如RENDEZVOUS_PORT、CONNECT_TIMEOUT、protobuf/rendezvous_proto消息序列化、socket_clientTCP/UDP 封装、udp::FramedSocket等是视频编解码工具、配置系统、TCP/UDP 覆盖层与文件传输 fs 函数等公用功能的汇聚点。libs/scrap屏幕捕获库。其源码按显示后端组织src/common/下含x11.rs、wayland.rs、dxgi.rs、quartz.rs、aom.rs、hwcodec.rs、vram.rs等并附带独立 libs/scrap/Cargo.toml主 crate 以features [wayland]引用它仓库顶层还通过 Cargo.toml 的hwcodec、vram、drm、mediacodec等 feature 门控不同硬编码/VRAM/DRM 路径。libs/enigo跨平台的键盘/鼠标控制含linux、macos、win三个平台实现目录如 libs/enigo/src/linux/mod.rs并提供examples/下的keyboard.rs、mouse.rs、timer.rs等示例Linux 端依赖 libxdo仓库甚至用 libs/libxdo-sys-stub 打补丁以支持无 libxdo 的 Wayland-only 环境。src/ui客户端界面sciter HTML/TIS 脚本 Rust 后端包括主界面index.html、remote.tis/remote.rs、cm.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.rs、macos.rs/macos.mm及privileges_scripts/macOS 安装/卸载守护进程脚本等src/lib.rs 按目标平台条件编译这些模块iOS 不启用 server 与 rendezvous_mediatorAndroid/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]提供了flutter、hwcodec、drm、drm-wake、screencapturekit、linux-pkg-config等开关例如drm-wake在drm捕获之外单独门控“显示唤醒”写入逻辑可按目标平台裁剪功能后使用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/rustdesk或target/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),仅供参考
返回列表