- 后端
- 网络
- 通信
- 音视频
【免费下载链接】FreeRDP
FreeRDP is a free remote desktop protocol library and clients
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.json | CMake 预设配置 |
| SECURITY.md | 安全策略与漏洞报告指引 |
| LICENSE | Apache 2.0 许可证 |
其中 include/freerdp/ 是公共 API 头文件的集中地,例如freerdp.h(核心库入口)、settings.h(连接设置)、peer.h(服务器端对等连接)、channels/(通道 API);而 include/config/ 下的config.h.in、version.h.in等由 CMake 在构建期生成最终配置头文件。
三、构建 FreeRDP:依赖体系与 CMake 配置
3.1 必需与可选依赖总览
根据 docs/README.building,FreeRDP 有一套清晰的依赖体系,编译前可按需准备。核心要点如下:
- 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 自带实现。 - Kerberos(可选,
-DWITH_KRB5=OFF禁用):许多服务(尤其是智能卡场景)的认证需要 Kerberos,支持 MIT 与 Heimdal 两种实现。 - JSON(可选,
-DWITH_JSON_DISABLED=ON禁用):Azure 登录需要解析 HTTP/JSON 消息,支持 cJSON 与 json-c。 - H264:RDP GFX 模式(Windows 8.1/Server 2012 之后的图形模式)基于 H264 编解码。支持 OpenH264(
-DWITH_OPENH264=ON)与 FFmpeg(x264/OpenH264,-DWITH_FFMPEG=ON),另有 Android mediacodec 等平台专属实现。 - 图形缩放(可选,HighDPI 必需):高 DPI 支持与智能缩放需要客户端对位图进行缩放,支持 Swscale(
-DWITH_SWSCALE=ON)与 Cairo(-DWITH_CAIRO=ON)。 - 音频编解码(可选但强烈推荐):声音与麦克风可传输压缩格式。最广泛支持的是未压缩 PCM 与压缩 AAC(Windows 8+),另有 GSM(
-DWITH_GSM=ON)、FFmpeg(-DWITH_DSP_FFMPEG)、SOXR(重采样,-DWITH_SOXR=ON)。实验性编解码(主要是 AAC 编码)用-DWITH_DSP_EXPERIMENTAL=ON开启。 - 智能卡(可选):PCSC(
-DWITH_PCSC=OFF禁用)用于智能卡重定向,pkcs11(-DWITH_PKCS11=OFF禁用)用于 NLA 智能卡登录。 - Unicode(必需,
-DWITH_UNICODE_BUILTIN=ON启用内置转换):协议字符串以 UCS-2/UTF-16 为主,需要 UTF 转换库:Windows 原生支持,Linux/Unix/Android 用 ICU,Apple 平台用原生 NSString 转换例程。 - USB 重定向(可选,
-DCHANNEL_URBDRC=OFF禁用):协议扩展通道支持底层 USB 重定向,依赖 libusb 1。 - 平台支持(主要针对 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 音频库。 - 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)设置激活。 - 服务器支持:FreeRDP 也提供服务器侧 RDP 协议实现,用于 RDP 代理(
-DWITH_PROXY=OFF禁用)与影子服务器(-DWITH_SHADOW=OFF禁用)。平台服务器实现(-DWITH_PLATFORM_SERVER=ON)尚不完善,仅可编译。 - 示例:提供客户端与服务端示例(
-DWITH_SAMPLE=OFF禁用)。 - 工具:构建若干证书与 NTLM 哈希处理辅助工具(
-DWITH_WINPR_TOOLS=OFF禁用)。
以上依赖的 CMake 探测逻辑可在 cmake/ 中查看,例如FindOpenH264.cmake、FindGSM.cmake、FindKRB5.cmake、FindPCSC.cmake、FindPulseAudio.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_VERSION、FREERDP_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)。 - 模块组织:按条件添加子目录——
libfreerdp、channels(WITH_CHANNELS)、client(WITH_CLIENT_COMMON/WITH_CLIENT)、server(WITH_SERVER)、winpr(统一构建时)、uwac(Wayland)、rdtk(WITH_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/pkgconfig4.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_COMPILED | ON | 使用 tzextract 提取的编译进二进制的映射 |
WITH_TIMEZONE_FROM_FILE | OFF | 使用 tzextract 生成的 JSON 文件映射 |
WITH_TIMEZONE_ICU | OFF | 使用 ICU 将 IANA 时区映射为 Windows 时区 |
WITH_TIMEZONE_UPDATER | OFF | 构建 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 数组:
multivk、kbdext、normal(条目为 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.txt、config-qa.txt、config-oss-fuzz.cmake),展示了针对不同质量目标的构建矩阵。
七、从 README 出发的进一步学习路径
README.md 的 Resources 一节汇总了官方资源入口,而本文所依托的仓库内部资源可按下述顺序继续深挖:
- 理解协议核心:从 libfreerdp/core/ 的
connection.c、transport.c、rdp.c入手,配合 include/freerdp/ 公共头文件了解连接建立与状态机; - 学习客户端实现:以 client/X11/(xfreerdp)为最小可读样本,观察
xf_client.c如何调用 libfreerdp API 完成连接与渲染; - 了解服务器侧:阅读 server/proxy/ 与 server/shadow/ 了解 RDP 代理与会话共享的工程实践;
- 运行测试:以
-DBUILD_TESTING=ON构建后执行ctest,测试用例分散于 libfreerdp/core/test/、libfreerdp/codec/test/ 等目录,可验证核心编解码与协议解析逻辑; - 自定义构建:参考 CMakePresets.json 与 ci/cmake-preloads/ 的预加载配置,用
cmake -C快速复现 CI 的构建矩阵。
总而言之,FreeRDP 是一个兼具协议库、多平台客户端、服务器实现与完整工具链的 RDP 开源生态。掌握其目录布局、依赖体系与 CMake 配置方式,是进行源码定制、二次开发与集成部署的第一步——本文给出的构建命令、选项表格与源码路径即可作为你上手实践的起点。
- 后端
- 网络
- 通信
- 音视频
【免费下载链接】FreeRDP
FreeRDP is a free remote desktop protocol library and clients
相关推荐
终极图片文字识别指南:让SiYuan知识管理效率提升300%
终极图片文字识别指南:让SiYuan知识管理效率提升300% 你是否曾经为PDF文献中的图表注释无法复制而烦恼?是否因会议照片里的白板内容难以整理而沮丧?SiY
知识管理知识库ReactNativeNWReactCalculator项目结构解析:从源码到构建的完整流程
ReactNativeNWReactCalculator项目结构解析:从源码到构建的完整流程 ReactNativeNWReactCalculator是一个创新
前端示例工程移动开发跨平台MiniMax-M1开发者进阶指南:自定义模型配置与扩展开发
MiniMax M1开发者进阶指南:自定义模型配置与扩展开发 MiniMax M1作为全球首个开源权重的大规模混合注意力推理模型,为开发者提供了强大的自定义配置
人工智能大模型基础模型工具调用
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考