FreeRDP 项目全解析:从源码结构、构建配置到 RDP 实现生态
2026/9/22 18:25:25 网站建设 项目流程
  • 后端
  • 网络
  • 通信
  • 音视频

【免费下载链接】FreeRDP

FreeRDP is a free remote desktop protocol library and clients

项目地址:https://gitcode.com/gh_mirrors/fr/FreeRDP
点击查看免费下载

FreeRDP 是一个采用 Apache 许可证发布的自由开源的远程桌面协议(Remote Desktop Protocol,RDP)实现,提供完整的协议库(libfreerdp)与跨平台客户端。本指南以仓库根目录 README.md 为骨架,结合 docs/README.building 构建说明、CMakeLists.txt 构建系统及仓库目录结构,系统讲解 FreeRDP 的项目定位、顶层目录布局、依赖体系、CMake 编译全流程与周边生态资源,帮助读者快速上手阅读源码、定制构建并投入实际使用。

一、项目定位:一份自由的 RDP 实现

FreeRDP 是对微软远程桌面协议(RDP)的自由实现,采用 Apache 许可证发布。其核心理念正如 README.md 所述:让互操作性最终解放你的计算体验——即用户可以在任何地方、以自己想要的方式自由使用软件,不再被私有协议与专有客户端所束缚。

从仓库结构看,FreeRDP 不仅是一个库,而是一整套围绕 RDP 的实现生态,包含:

  • 协议库libfreerdp/:RDP 协议的核心实现,涵盖核心连接(core)、编解码(codec)、加密(crypto)、GDI 图形抽象、locale 与基础工具(utils)等。
  • 独立工具库winpr/:FreeRDP 自带的 Windows 可移植运行时库(Windows Portable Runtime),提供线程、文件、注册表、网络等跨平台 API,是 libfreerdp 的底层依赖。
  • 通道实现channels/:RDP 动态与静态虚拟通道,如剪贴板(cliprdr)、驱动器重定向(rdpdr)、远程桌面显示(remdesk)、音视频(rdpsnd/rdpgfx/video)等 30 余个通道模块。
  • 客户端client/:面向 X11(xfreerdp)、Wayland(wlfreerdp)、Windows(wfreerdp)、macOS、iOS、Android、SDL2/SDL3 等平台的客户端。
  • 服务器侧server/:包括 RDP 代理(proxy)、影子服务器(shadow)与示例服务器(Sample)。
  • 辅助工具与文档uwac/rdtk/docs/ci/cmake/等。

二、仓库顶层目录导读

在深入编译之前,先建立对仓库整体布局的认知。仓库根目录的主要模块如下:

目录/文件职责
libfreerdp/RDP 协议核心库:core(连接/传输/状态机)、codec(编解码)、crypto(证书与加密)、gdi(GDI 抽象)等
winpr/Windows Portable Runtime:跨平台系统抽象层,FreeRDP 的底层运行时
channels/各类 RDP 虚拟通道的客户端与服务端实现
client/各平台客户端:X11、Wayland、Windows、macOS、iOS、Android、SDL 等
server/服务器侧实现:proxy(RDP 代理)、shadow(影子会话)、Sample 示例
include/对外公共头文件,分 freerdp 与 config 两大部分
cmake/CMake 模块:依赖探测、编译器标志、打包、文档生成等
docs/构建、配置、平台相关的补充文档
ci/持续集成脚本与 CMake 预加载配置(如 config-linux-all.txt)
scripts/各类开发/CI 辅助脚本(mingw 构建、时区更新、打包等)
packaging/deb/rpm/flatpak 等发行版打包配置
CMakeLists.txt顶层 CMake 构建入口
CMakePresets.jsonCMake 预设配置
SECURITY.md安全策略与漏洞报告指引
LICENSEApache 2.0 许可证

其中 include/freerdp/ 是公共 API 头文件的集中地,例如freerdp.h(核心库入口)、settings.h(连接设置)、peer.h(服务器端对等连接)、channels/(通道 API);而 include/config/ 下的config.h.inversion.h.in等由 CMake 在构建期生成最终配置头文件。

三、构建 FreeRDP:依赖体系与 CMake 配置

3.1 必需与可选依赖总览

根据 docs/README.building,FreeRDP 有一套清晰的依赖体系,编译前可按需准备。核心要点如下:

  1. SSL(必需):RDP 依赖 TLS 建立安全隧道,FreeRDP 不自行实现而复用现有库。主开发库为 OpenSSL(-DWITH_OPENSSL=ON,默认);社区支持 LibreSSL(作为 OpenSSL 的替代品)与 MBedTLS(-DWITH_OPENSSL=OFF -DWITH_MBEDTLS=ON)。若 SSL 库废弃了某些算法,可用-DWITH_INTERNAL_MD4=ON-DWITH_INTERNAL_MD5=ON-DWITH_INTERNAL_RC4=ON让 FreeRDP 自带实现。
  2. Kerberos(可选,-DWITH_KRB5=OFF禁用):许多服务(尤其是智能卡场景)的认证需要 Kerberos,支持 MIT 与 Heimdal 两种实现。
  3. JSON(可选,-DWITH_JSON_DISABLED=ON禁用):Azure 登录需要解析 HTTP/JSON 消息,支持 cJSON 与 json-c。
  4. H264:RDP GFX 模式(Windows 8.1/Server 2012 之后的图形模式)基于 H264 编解码。支持 OpenH264(-DWITH_OPENH264=ON)与 FFmpeg(x264/OpenH264,-DWITH_FFMPEG=ON),另有 Android mediacodec 等平台专属实现。
  5. 图形缩放(可选,HighDPI 必需):高 DPI 支持与智能缩放需要客户端对位图进行缩放,支持 Swscale(-DWITH_SWSCALE=ON)与 Cairo(-DWITH_CAIRO=ON)。
  6. 音频编解码(可选但强烈推荐):声音与麦克风可传输压缩格式。最广泛支持的是未压缩 PCM 与压缩 AAC(Windows 8+),另有 GSM(-DWITH_GSM=ON)、FFmpeg(-DWITH_DSP_FFMPEG)、SOXR(重采样,-DWITH_SOXR=ON)。实验性编解码(主要是 AAC 编码)用-DWITH_DSP_EXPERIMENTAL=ON开启。
  7. 智能卡(可选):PCSC(-DWITH_PCSC=OFF禁用)用于智能卡重定向,pkcs11(-DWITH_PKCS11=OFF禁用)用于 NLA 智能卡登录。
  8. Unicode(必需,-DWITH_UNICODE_BUILTIN=ON启用内置转换):协议字符串以 UCS-2/UTF-16 为主,需要 UTF 转换库:Windows 原生支持,Linux/Unix/Android 用 ICU,Apple 平台用原生 NSString 转换例程。
  9. USB 重定向(可选,-DCHANNEL_URBDRC=OFF禁用):协议扩展通道支持底层 USB 重定向,依赖 libusb 1。
  10. 平台支持(主要针对 Linux):SDL2(SDL 客户端,-DWITH_CLIENT_SDL=OFF)、CUPS(打印,-DWITH_CUPS=OFF)、libsystemd(journald 日志,-DWITH_SYSTEMD=OFF)、PAM(服务器端认证)、FUSE(Linux/macOS 文件剪贴板,-DWITH_FUSE=OFF)、Wayland(wlfreerdp,-DWITH_WAYLAND=OFF)、X11 开发头文件(X11 客户端,-DWITH_X11=OFF)、ALSA/PULSE/OSS 音频库。
  11. WebAuthn / FIDO2 重定向(可选,-DCHANNEL_RDPEWA=OFF禁用):[MS-RDPEWA] WebAuthn 虚拟通道把服务器侧的 WebAuthn/FIDO2 认证请求转发到客户端本地安全密钥,可在远程会话内实现免密登录(passkey)与双因素认证。自动启用需 libcbor(CBOR 编解码)与 libfido2(FIDO2/CTAP2 通信);Debian/Ubuntu 用apt install libcbor-dev libfido2-dev,Fedora 用dnf install libcbor-devel libfido2-devel。通道通过 .rdp 文件中的redirectwebauthn(FreeRDP_RedirectWebAuthN)设置激活。
  12. 服务器支持:FreeRDP 也提供服务器侧 RDP 协议实现,用于 RDP 代理(-DWITH_PROXY=OFF禁用)与影子服务器(-DWITH_SHADOW=OFF禁用)。平台服务器实现(-DWITH_PLATFORM_SERVER=ON)尚不完善,仅可编译。
  13. 示例:提供客户端与服务端示例(-DWITH_SAMPLE=OFF禁用)。
  14. 工具:构建若干证书与 NTLM 哈希处理辅助工具(-DWITH_WINPR_TOOLS=OFF禁用)。

以上依赖的 CMake 探测逻辑可在 cmake/ 中查看,例如FindOpenH264.cmakeFindGSM.cmakeFindKRB5.cmakeFindPCSC.cmakeFindPulseAudio.cmake等。

3.2 标准构建流程

官方推荐的构建方式(源自 docs/README.building)使用 Ninja 加速,并要求分离源码目录与构建/安装目录。以源码位于/tmp/freerdp/src、安装到/tmp/freerdp/install为例(Windows 上需在 Visual Studio 命令行或执行过 vcvarsall.bat 的 cmd 中运行,路径按需调整):

cmake -GNinja -DCMAKE_BUILD_TYPE=Release \ -DWITH_VERBOSE_WINPR_ASSERT=OFF \ -DCMAKE_PREFIX_PATH=/tmp/freerdp/install \ -B /tmp/freerdp/build -S /tmp/freerdp/src cmake --build /tmp/freerdp/build --target install

构建建议要点:

  • 优先使用Ninja生成器加速构建;
  • 正式发布构建使用-DCMAKE_BUILD_TYPE=Release(或RelWithDebInfo,优化略低但保留调试符号);
  • -DWITH_VERBOSE_WINPR_ASSERT=OFF能显著减小体积,但会移除大量代码内健全性检查:稳定发布版推荐关闭;非稳定版本推荐保持ON,以便崩溃时获得有用信息。

另有几个实用技巧:

  • Linux/macOS 下可用ccmake(curses 界面)直接查看/修改 CMakeCache.txt 中的构建配置变量;
  • CMake 支持预加载文件(见仓库 ci/ 子目录),可先定义好整套构建配置,再用cmake -C <preload file>应用。例如 config-linux-all.txt 就是一个开启全部 Linux 功能、地址消毒器与测试的 QA 预加载配置。

3.3 顶层 CMake 结构

CMakeLists.txt 是构建系统的总入口,从源码结构看它完成了以下关键工作:

  • 版本管理:通过GetProjectVersion模块从 git 与版本文件解析出版本号(FREERDP_VERSIONFREERDP_API_VERSION),并据此推导头文件目录include/freerdp<major>/、插件目录等路径。
  • 依赖探测:使用find_feature框架统一声明 OpenSSL(必需)、MbedTLS(可选/实验性)、PCSC(推荐)、OpenH264、GSM、LAME、FAAD2、FAAC、soxr、aom、dav1d、yuv 等特性;并处理 LibreSSL 替换、FFmpeg 版本下限检查(音频后端要求 AVCODEC 至少 57.48.101)。
  • 模块组织:按条件添加子目录——libfreerdpchannelsWITH_CHANNELS)、clientWITH_CLIENT_COMMON/WITH_CLIENT)、serverWITH_SERVER)、winpr(统一构建时)、uwac(Wayland)、rdtkWITH_RDTK)等。
  • 路径规划:通过WITH_ABSOLUTE_PLUGIN_LOAD_PATHS决定数据、库、插件、扩展与代理插件目录是绝对路径还是相对路径;Windows/macOS bundle/Android 默认相对路径,其余平台默认绝对路径。
  • 平台适配:为 Windows(UNICODE 定义、WINVER 选择)、macOS、Android(NDK 日志、FREERDP_EXTERNAL_PATH)、Apple 等分别设置编译定义。
  • 打包与测试:集成 CTest、CPack(CMakeCPack.cmake),并收集WITH_*BUILD_TESTING*WINPR_HAVE_*变量形成构建配置列表供导出。

四、平台专项构建说明

4.1 macOS

自 El Capitan 起 Apple 移除了 OpenSSL 头文件,因此需要先手动构建 OpenSSL(例如通过 MacPorts 或 Homebrew),并在构建前将PKG_CONFIG_PATH指向 OpenSSL 根目录(docs/README.macOS):

export PKG_CONFIG_PATH=$(brew --prefix)/opt/openssl/lib/pkgconfig

4.2 Windows(MinGW/LLVM-MinGW)

FreeRDP 可使用 llvm-mingw 在 Windows 上构建(同时支持 msvcrt 与 ucrt)。仓库 scripts/mingw.sh 提供了示例构建脚本,并被 CI 工作流定期执行;完整的 LLVM-MinGW 示例构建系统见 docs/mingw-example/(含 toolchain 与针对 x64/ia32/arm64 的build_*.sh脚本)。需注意:MinGW 构建目前维护并不活跃,构建过程偶尔可能失效,欢迎提交维护 MinGW 支持的 Pull Request(docs/README.mingw)。

4.3 Android 与 iOS

  • Android 客户端源码位于 client/Android/(含 Android Studio 工程与 cmake 辅助脚本),CMake 侧在顶层为 Android 追加 NDK 日志、FREERDP_EXTERNAL_PATH查找路径等适配;
  • iOS 客户端位于 client/iOS/,另有 docs/README.ios 与 cmake/ios.toolchain.cmake 工具链说明。

五、运行时配置与资源文件

5.1 JSON 配置与资源目录

FreeRDP 支持以 JSON 格式进行多种运行时配置(docs/README.configuration)。资源基目录的查找遵循从新到旧的兼容顺序,受两个构建选项组合影响:

  • <base>/<vendor>/<product><version>-DWINPR_USE_VENDOR_PRODUCT_CONFIG_DIR=ON -DWITH_RESOURCE_VERSIONING=ON
  • <base>/<vendor>/<product>-DWINPR_USE_VENDOR_PRODUCT_CONFIG_DIR=ON -DWITH_RESOURCE_VERSIONING=OFF
  • <base>/<product><version>-DWINPR_USE_VENDOR_PRODUCT_CONFIG_DIR=OFF -DWITH_RESOURCE_VERSIONING=ON
  • <base>/<product>(两者均 OFF)
  • <base>/WinPR-DWINPR_USE_LEGACY_RESOURCE_DIR=ON

5.2 时区映射

当以-DWITH_TIMEZONE_FROM_FILE=ON构建时,时区定义从TimeZoneMap.json加载(通常位于WINPR_RESOURCE_ROOT资源目录)。时区相关构建选项(docs/README.timezones)还包括:

选项默认说明
WITH_TIMEZONE_COMPILEDON使用 tzextract 提取的编译进二进制的映射
WITH_TIMEZONE_FROM_FILEOFF使用 tzextract 生成的 JSON 文件映射
WITH_TIMEZONE_ICUOFF使用 ICU 将 IANA 时区映射为 Windows 时区
WITH_TIMEZONE_UPDATEROFF构建 tzextract 工具

使用建议:单二进制(全静态)构建适合WITH_TIMEZONE_COMPILED;发行版软件包适合WITH_TIMEZONE_FROM_FILE(无需重编译即可更新映射,且与 compiled 模式可组合使用,文件条目优先于编译条目);已链接 ICU 的目标适合WITH_TIMEZONE_ICU,它仅作为前两者不匹配时的回退方案。时区映射更新可运行构建出的tzextract <path to source>\winpr\libwinpr\timezone(需-DWITH_TIMEZONE_UPDATER=ON),或在任意机器上运行仓库根目录的./scripts/update-windows-zones.py,更新后检查并提交 winpr/libwinpr/timezone/WindowsZones.c 的变更。

5.3 键盘 VK 到扫描码映射

资源目录WINPR_RESOURCE_ROOT下的KeyboardMapping.json若存在且合法,将覆盖内置的 VK(虚拟键码)到扫描码映射。其格式为(docs/README.configuration):

  • 整个配置嵌入一个 JSON 对象;
  • 顶层对象中为每种WINPR_KBD_TYPE提供一个命名对象;
  • 每个对象包含三个各含 128 个条目的 JSON 数组:multivkkbdextnormal(条目为 VK_* 码的字符串表示或数字)。
{ "WINPR_KBD_TYPE_IBM_PC_XT": { "multivk": ["VK_NONE", 12, ...], "kbdext": ["VK_NONE", 24, ...], "normal": ["VK_NONE", 33, ...] } }

5.4 .rdp 文件与命令行配置

除 CMake 选项外,FreeRDP 客户端还支持通过 .rdp 文件与命令行参数配置连接行为。典型的客户端入口(如 client/X11/xfreerdp.c 与 client/SDL/)会解析这些参数并写入rdpSettings(定义于 include/freerdp/settings.h)。公共命令行参数定义可参考 client/common/cmdline.h。例如前述 WebAuthn 通道即通过 .rdp 文件的redirectwebauthn设置(FreeRDP_RedirectWebAuthN)启用;client/common/test/ 目录下还提供了大量 .rdp 与 .json 测试样本,可供对照参数格式。

六、代码质量与安全

FreeRDP 仓库的 README.md 展示了持续集成状态与质量保障体系:

  • ABI 检查:通过 abi-checker 工作流监控公共 ABI 变化;
  • 静态分析:集成 clang-tidy review 与 CodeQL;
  • 多平台构建验证:mingw-builder、macos-builder、[arm/ppc/riscv] 架构构建、freebsd 构建;
  • Coverity 扫描:项目接入 scan.coverity.com 进行缺陷扫描;
  • 安全相关策略见 SECURITY.md(含漏洞报告渠道)。

上述工作流对应仓库根目录 .github/(或 CI 配置)中的定义,CI 预加载配置集中于 ci/cmake-preloads/(如config-coverity.txtconfig-qa.txtconfig-oss-fuzz.cmake),展示了针对不同质量目标的构建矩阵。

七、从 README 出发的进一步学习路径

README.md 的 Resources 一节汇总了官方资源入口,而本文所依托的仓库内部资源可按下述顺序继续深挖:

  1. 理解协议核心:从 libfreerdp/core/ 的connection.ctransport.crdp.c入手,配合 include/freerdp/ 公共头文件了解连接建立与状态机;
  2. 学习客户端实现:以 client/X11/(xfreerdp)为最小可读样本,观察xf_client.c如何调用 libfreerdp API 完成连接与渲染;
  3. 了解服务器侧:阅读 server/proxy/ 与 server/shadow/ 了解 RDP 代理与会话共享的工程实践;
  4. 运行测试:以-DBUILD_TESTING=ON构建后执行ctest,测试用例分散于 libfreerdp/core/test/、libfreerdp/codec/test/ 等目录,可验证核心编解码与协议解析逻辑;
  5. 自定义构建:参考 CMakePresets.json 与 ci/cmake-preloads/ 的预加载配置,用cmake -C快速复现 CI 的构建矩阵。

总而言之,FreeRDP 是一个兼具协议库、多平台客户端、服务器实现与完整工具链的 RDP 开源生态。掌握其目录布局、依赖体系与 CMake 配置方式,是进行源码定制、二次开发与集成部署的第一步——本文给出的构建命令、选项表格与源码路径即可作为你上手实践的起点。

  • 后端
  • 网络
  • 通信
  • 音视频

【免费下载链接】FreeRDP

FreeRDP is a free remote desktop protocol library and clients

项目地址:https://gitcode.com/gh_mirrors/fr/FreeRDP
点击查看免费下载

相关推荐

上一篇:QQ音乐加密文件解密终极指南:qmcdump 让你的音乐重获自由
下一篇:E-Hentai漫画批量下载终极指南:5分钟快速入门与完整教程

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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询