1. 背景:为什么“Wayland、PipeWire、开源正在慢慢关闭”值得讨论
最近在一些开发者社区里看到一种话题,题目大致是“Wayland、PipeWire、Open Source Slowly Closing”。乍一看容易误解为这三个项目是不是要停止维护了,但实际上讨论的核心是另一件事:Linux 桌面生态中的基础组件,正在经历一轮“换血”。Wayland 逐步替代 X11,PipeWire 逐步替代 PulseAudio,同时开源项目在许可证、商业模式、维护方式上也在调整。对于普通用户来说,这种变化最直接的感受就是“某个新功能迟迟不来”“某个老功能突然变了”“某些程序报错看不懂”。
如果你最近搜索过以下关键词,那你就是本文的目标读者:
- X11 和 Wayland 到底有什么区别
- Linux Wayland 切换到 X11 怎么操作
- GNOME 的 Wayland 扩展在哪设置
- Qt 程序报错 qt.qpa.plugin: could not find the qt platform plugin "wayland"
- 单片机交叉编译时报错 cannot open source input file "arm_acle.h"
- 嵌入式编译报错 fatal error[pe1696]: cannot open source file "core_cm0plus.h"
这些看似零散的问题,其实都围绕着同一件事:新老技术交替期,环境、配置、依赖都在变。这篇文章会把 Wayland、PipeWire 的来龙去脉讲清楚,再把上面这些高频报错的排查方法给出完整方案。适合 Linux 桌面使用者、嵌入式开发者和搞音视频流处理的技术人员阅读。
需要提前说明的是,很多问题没有唯一的“标准答案”,因为每个人的发行版、桌面环境、显卡驱动、Qt 版本都不同。本文以 Ubuntu 22.04 / 24.04、GNOME 桌面、Qt 6 的常见环境为例,重点讲清楚排查思路和关键配置。
2. 核心概念:Wayland 是什么,它为什么“慢”
2.1 X11 的问题:为什么需要 Wayland
X11(X Window System 11)诞生于 1987 年,距今已经三十多年。它的设计目标是在网络上传输图形界面,所以采用了“客户端-服务器”模型:X Server 管理硬件显示,X Client 是各种应用程序,两者之间通过 X11 协议通信。
这套架构在当年非常先进,但现在也暴露出一堆问题:
- 渲染链路过长:应用绘制内容要先通过 X Server 合成再交给显卡,中间多了不少内存拷贝。
- 安全隐患多:任意一个 X Client 程序都能监听其他程序的事件,比如键盘输入。这对金融类、密码管理类应用非常不友好。
- 撕裂与闪屏:X11 的合成器(Compositor)与显示器刷新率不同步时,画面容易撕裂。
- 高 DPI 支持差:X11 时代的高分屏体验普遍滞后,缩放只能做整数倍,导致很多 Linux 笔记本在 2K/4K 屏上界面发虚。
Wayland 就是为替代 X11 而生的显示协议。它的核心思路是:让合成器(Compositor)成为显示服务的核心,客户端直接把内容提交给合成器,由合成器完成合成和显示。这样链路更短,各种视觉效果(圆角、模糊、半透明)也能在合成层统一处理。
2.2 Wayland 是怎么运作的
Wayland 并不是一个具体的软件,而是一套协议。GNOME 的 Mutter、KDE 的 KWin 都实现了这套协议,它们既是窗口管理器,也是合成器。用户跟系统交互的流程变成了:
应用窗口 → 直接渲染到缓冲区 → 提交给合成器 → 合成器合成全部窗口 → 输出到显示器相比 X11 的“应用→X Server→合成器→显示器”流程,Wayland 少了一层转发,延迟更低,画面更平滑。
一个容易混淆的地方是:Wayland 本身不限制应用必须使用哪种图形库。GTK、Qt 程序都做了 Wayland 适配,Electron 应用也支持通过 ozone 参数启用 Wayland。老旧的 X11 应用则通过 XWayland 兼容层运行。
2.3 为什么 Wayland 的替换过程看起来“慢”
WWayland 从 2008 年开始开发,到今天已经十多年,但很多用户仍然觉得它“没准备好”。原因主要有几个:
- 生态分裂严重:Wayland 只是一个协议,不同桌面环境实现方式不一致。同一个功能在 GNOME 上能用,在 KDE 上可能就要等几个版本。
- 老应用兼容成本高:很多老程序依赖 X11 的全局坐标、窗口截图、全局快捷键等机制,在 Wayland 下要么被限制、要么功能被禁用。比如 OBS 早期在 Wayland 下无法录制指定窗口,就是因为 Wayland 出于安全考虑不允许随意读取其他窗口内容。
- 硬件厂商适配节奏慢:NVIDIA 驱动对 Wayland 的支持经历了非常漫长的过程,直到 2022 年以后的驱动版本才比较可靠。对很多用 NVIDIA 显卡的游戏玩家来说,Wayland 的体验差一直持续了很长时间。
- 默认发行策略保守:很多发行版虽然默认会话已经是 Wayland,但仍然保留了 X11 会话入口。这给了用户“两条腿走路”的观感,也让部分用户根本没有意识到自己已经跑在 Wayland 上。
所以你会发现,“Open Source Slowly Closing”这个说法其实不太准确。Wayland 和 PipeWire 非但没有停止发展,反而正在大量合并来自各厂商、各社区的补丁。用户感知到的“慢”,是整套桌面生态从底层协议、工具链、驱动到应用适配全链路迁移的必然周期。
3. PipeWire:打通音频视频的下一代多媒体服务
3.1 PipeWire 解决什么问题
在 PipeWire 之前,Linux 桌面音频领域是两大阵营:
- PulseAudio:负责应用音频的混音和路由。
- JACK:负责专业音频的低延迟处理。
这两套系统并不互通。普通用户装 JACK 经常把 PulseAudio 搞坏,专业音频用户又嫌 PulseAudio 延迟太高。
PipeWire 的定位是“统一音频视频处理框架”。它既能像 PulseAudio 一样处理应用音频,也能像 JACK 一样提供低延迟专业音频能力,还能处理视频流的共享和录制。更重要的是,它在架构设计上加入了安全策略,会话管理器(WirePlumber)会控制客户端对音频设备的访问权限,避免普通应用随意偷录麦克风。
3.2 PipeWire 的基本架构
PipeWire 由几个部分组成:
- pipewire 服务:核心服务,处理节点、端口、缓冲区的连接。
- pipewire-pulse 兼容层:让老 PulseAudio 客户端直接走 PipeWire,不需要改代码。
- WirePlumber:默认会话管理器,负责设备管理和策略执行。
- 客户端库:应用通过 libpipewire、libpulse 与 PipeWire 交互。
从用户视角看,替换 PulseAudio 后最大的变化有几个:蓝牙设备自动切换更稳定、录音混音更方便、专业音频软件可以直接读取浏览器输出、应用间音频路由可以通过图形化工具直观管理。
3.3 PipeWire 的常用命令
查看当前音频服务情况:
# 查看系统音频服务状态 systemctl --user status pipewire pipewire-pulse # 重启音频服务 systemctl --user restart pipewire pipewire-pulse # 查看 PipeWire 当前所有节点 pw-cli list-objects # 查看音频设备信息 pw-dump如果应用还在走旧的 PulseAudio 接口,想看是否已经落到 PipeWire 上,可以运行:
pactl info如果输出中的“Server Name”字段包含PipeWire,说明兼容层已经接管成功。例如:
Server Name: PulseAudio (on PipeWire 1.0.0)这说明应用虽然走的是 PulseAudio 旧接口,但底层已经由 PipeWire 处理。
对于想要把某个应用输出重定向到特定设备的场景,强烈推荐安装图形化路由工具:
sudo apt install qpwgraphQPWGraph 以连线的方式展示所有音频输入输出节点,拖拽连接线就能改变路由,排查音频问题非常直观。
4. 从开源生态看“慢慢关闭”
4.1 开源许可证的理论基础
很多人在讨论开源时,会忽略许可证的重要性。开源并不意味着“代码完全自由、没有任何约束”,核心其实是四种许可证层面的自由:
- 任意使用。
- 研究源码。
- 修改源码。
- 再分发。
但在这四条之上,许可证还可以附加条件。比如 GPL 要求衍生作品同样以 GPL 许可证发布;MIT、BSD、Apache 2.0 允许商用闭源;LGPL 允许动态链接后不传染闭源代码;MPL 要求在文件级别保持开源。
所以当你看到某个开源项目更换许可证时,不要急于理解成“项目关闭了”。它可能只是从开发者自由使用转向了“既要兼顾开发者、也要维护可持续商业模式”。
4.2 商业公司与开源社区的博弈
近年在开源圈子讨论最多的事件包含 Redis 修改许可证、Elasticsearch 修改许可证、HashiCorp 修改许可证。这些项目的共同特点是:核心技术被云厂商直接打包成收费服务,但开源项目自身的开发者没有获得合理回报。
这类事件本质上是商业模式的问题。项目还是开源的,代码也还公开,但使用范围加上了边界。这种调整很难用好坏来简单评判。从维护者角度看,如果项目没有任何收入,持续维护的动力会逐渐消失;从使用者角度看,能免费使用的时间更长一些当然更好。
Linux 桌面应用领域也有类似趋势,但 Wayland、PipeWire 这些基础组件所在的生态,并没有出现“关闭”的迹象。原因是它们背后有多个利益相关的公司共同推动:Red Hat、SUSE、Canonical 都在依赖这些组件构建自己的桌面产品,Intel、AMD 也需要统一的显示协议来优化驱动。基础组件一旦关闭,最受伤的是这些公司自己的产品。所以多利益方共同维护,反而是这些项目生命力最强的保障。
4.3 技术演进其实是一种“再开放”
从 X11 到 Wayland,从 PulseAudio 到 PipeWire,表面看是老项目“被关闭”,实际上是新项目继承了老项目的思想,再做得更干净、更安全、更适合现代硬件。
一个很好的例子是 Qt 的 Wayland 支持。Qt 5 时代需要通过-platform wayland指定运行后端,Qt 6 时代 Wayland 已经被作为第一等平台集成。理想情况下,未来开发者不再需要关心用户跑在 X11 还是 Wayland 上,框架会处理好这些差异。
这就是所谓的“慢慢关闭”的另一面:老项目没有立刻停止维护,新项目也没有急着删除所有兼容层。它们选择了一种渐进式的演进策略,让开发者和用户有足够时间迁移。
5. 实战排查:Wayland 与 PipeWire 的高频问题
这部分是本文最实用的环节。下面把搜索热词中出现的几个典型问题集中整理,按现象、原因、解决方案展开。
5.1 Linux Wayland 切换到 X11
在 Ubuntu 的登录界面(GDM)选择用户后,通常可以在右下角看到一个齿轮或类似“设置”的小图标。点击后可以从列表中选择:
- Ubuntu(默认,Wayland 会话)
- Ubuntu on Xorg(X11 会话)
如果你希望系统始终默认进入 X11 会话,可以通过配置 GDM 实现。
Ubuntu 22.04 / 24.04 的 GDM 默认配置路径是/etc/gdm3/custom.conf,但更推荐直接修改配置文件再重启:
# 查看当前会话类型 echo $XDG_SESSION_TYPE # 备份 GDM 配置 sudo cp /etc/gdm3/custom.conf /etc/gdm3/custom.conf.bak # 编辑配置文件 sudo gedit /etc/gdm3/custom.conf在[daemon]节中取消WaylandEnable=false的注释:
[daemon] WaylandEnable=false然后重启 GDM:
sudo systemctl restart gdm3重启后系统会默认进入 Xorg 会话。请注意,GDM 自身也需要 XWayland 来绘制登录界面,禁用 Wayland 后 GDM 会完全退回 X11,这并不影响 X11 会话的使用。
如果你的发行版不是 Ubuntu,比如是 Fedora 或 Arch Linux,配置方式会有所不同。Fedora 使用gdm时可以在/etc/gdm/custom.conf中配置,Arch 用户可以参考GDM的 Wiki 说明。不论哪种发行版,建议在切换前先备份原配置,避免误操作导致登录界面异常。
5.2 GNOME 的 Wayland 扩展在哪里设置
很多用户在 GNOME Wayland 会话下发现扩展安装后不生效,然后会到处找“Wayland 扩展设置入口”。实际上,GNOME 的扩展机制在 Wayland 和 X11 下的安装目录是一致的,唯一的区别是扩展的启用方式受 GNOME Shell 版本影响。
最常用的扩展管理方法有两种。
第一种是直接用浏览器安装,前提是已经安装 GNOME Shell 集成扩展:
sudo apt install gnome-browser-connector然后打开 GNOME 扩展网站,浏览器会提示安装本地连接器,之后就能直接安装和开关扩展,不需要命令行。
第二种是手动安装到用户目录:
# 解压扩展到用户扩展目录 unzip 扩展压缩包.zip -d ~/.local/share/gnome-shell/extensions/安装完成后,打开“扩展管理器”类应用或运行:
gnome-extensions list查看当前已安装扩展的 UUID,再使用:
gnome-extensions enable 扩展UUID启用指定扩展。
在 Wayland 会话下,扩展的加载和 X11 下基本没有区别。如果遇到扩展不生效,优先排查 GNOME Shell 版本与扩展兼容性,因为 GNOME 主版本更新后扩展必须同步适配。旧扩展的 metadata.json 里的shell-version字段不包含当前 GNOME 版本时,GNOME 会直接拒绝加载。
5.3 Qt 程序报错:qt.qpa.plugin: could not find the qt platform plugin "wayland"
这个错误在很多 Ubuntu 用户中非常常见,尤其是手动编译 Qt 程序后运行时报错。
完整的报错信息通常类似:
qt.qpa.plugin: Could not find the Qt platform plugin "wayland" in "" This application failed to start because no Qt platform plugin could be initialized. Reinstalling the application may fix this problem.常见原因有两个:
第一个原因:缺少 Qt 的 Wayland 平台插件。
Ubuntu 下可以通过安装对应 Qt 平台的插件包解决:
sudo apt install qt6-wayland或者老版本:
sudo apt install qtwayland5安装后 Qt 程序才能找到libqwayland.so平台插件。
第二个原因:编译时配置的 Qt 路径与运行时插件路径不一致。
比如你自己编译了 Qt 源码,但运行程序时系统使用的QT_QPA_PLATFORM_PLUGIN_PATH没有指到插件目录。这时可以先检查:
# 查看当前 Qt 平台插件路径 echo $QT_QPA_PLATFORM_PLUGIN_PATH # 搜索 find 定位 libqwayland.so find /usr -name "libqwayland*" 2>/dev/null找到插件实际路径后,手动指定:
export QT_QPA_PLATFORM_PLUGIN_PATH=/usr/lib/x86_64-linux-gnu/qt6/plugins/platforms export QT_QPA_PLATFORM=wayland ./你的Qt程序如果程序还是无法启动,可以暂时切到 XWayland 兼容模式:
export QT_QPA_PLATFORM=xcb ./你的Qt程序这样做虽然使用的是 X11 兼容层,但至少能让程序先运行起来。
顺便提一个搜索热词中看到的嵌入式报错:fatal error[pe1696]: cannot open source file "core_cm0plus.h"。这个错误一般出现在 Keil MDK 环境下,原因通常是 CMSIS 包不完整或者工程文件里包含路径没有指向正确的 CMSIS 目录。解决方法是重新添加包含路径到\ARM\PACK\ARM\CMSIS\...\CMSIS\Include,或者在 Pack Installer 中重新安装对应设备的 Device Family Pack。另一个类似报错cannot open source input file "arm_acle.h",一般也是编译器找不到 ARM 汇编头文件,常见于 GCC ARM 工具链的 include 路径缺失,检查环境变量 C_INCLUDE_PATH 和工程头文件搜索路径即可。
5.4 Wayland 会话下无法录屏或远程控制
OBS、Chrome、ZOOM 等软件在 Wayland 下录屏经常遇到黑屏或无法选择窗口的问题。根本原因是 Wayland 的安全机制不允许程序默认读取整个屏幕。
大部分 Linux 发行版使用的屏幕共享方式基于 PipeWire 的ScreenCast端口。当程序发起录屏请求时,桌面环境会弹出授权对话框,用户确认后程序才能获取画面。
对 OBS 用户来说,最简单的方案是安装 xdg-desktop-portal 相关组件:
sudo apt install xdg-desktop-portal-gnome xdg-desktop-portal然后确认 OBS 的源码设置为 PipeWire 模式:
OBS → 设置 → 视频 → 采集方式 → PipeWire如果授权对话框一直不弹出,或者弹出后选择某个窗口没有画面,可以尝试重启 portal 服务:
systemctl --user restart xdg-desktop-portal systemctl --user restart xdg-desktop-portal-gtk另外,在 GNOME Wayland 下录屏默认只支持 30 帧左右,这是当前 portal 实现的限制,不是硬件问题。
5.5 PipeWire 无声或设备不切换
如果系统更新后突然没有声音,先确认服务状态:
systemctl --user status pipewire pipewire-pulse如果服务是活的,再检查输出设备信息:
wpctl status输出类似:
Audio ├── Sinks: │ 41. Built-in Audio Analog Stereo [vol: 0.90] │ * 42. USB Audio Device Analog Stereo*表示当前的默认输出设备。如果默认设备不对,可以通过编号切换:
wpctl set-default 42如果你需要精确控制每个应用的音量,安装pavucontrol(PulseAudio 前端,依然可用于 PipeWire-pulse):
sudo apt install pavucontrol pavucontrol在“播放”标签页里可以为每个应用单独选择输出设备。如果应用没有出现在列表里,可以先播放一段音频,再打开面板查看。
蓝牙音箱连接后没有声音,优先排查蓝牙服务权重。PipeWire 环境下建议安装libspa-0.2-bluetooth(Ubuntu 上自动作为依赖安装),然后重启蓝牙服务:
systemctl --user restart wireplumber systemctl restart bluetooth再次配对连接后,用上述pavucontrol检查输出设备路由。
6. 趋势判断与选型建议
6.1 现在该用 Wayland 还是 X11
这个问题没有绝对答案,取决于你的使用场景。
你可以用以下几条标准快速判断:
| 使用场景 | 推荐选择 | 理由 |
|---|---|---|
| 日常办公、浏览器、办公软件 | Wayland | 高分屏缩放、触摸板手势、安全性更好 |
| NVIDIA 显卡 + 老驱动 | X11 | 老驱动在 Wayland 下问题较多,新驱动则可以放心用 |
| 远程桌面 | X11 | xrdp、VNC 等老工具对 X11 支持更成熟 |
| 游戏 + 老显卡 | X11 | 兼容性更好,避免各种合成器层叠问题 |
| 开发调试图形程序 | 双会话切换 | Wayland 用于日常,X11 用于需要 X11 特性的场景 |
如果你的显卡是 NVIDIA,且驱动版本已经在 535 以上,Wayland 的体验已经有了大幅改善。Firefox、Chrome 等浏览器在 Wayland 下开启硬件视频加速后,功耗和流畅度都比 X11 更好。
6.2 用 PipeWire 还是 PulseAudio
除非你维护的是老系统,否则建议直接使用 PipeWire。Ubuntu 22.04 以后的版本默认就是 PipeWire,Arch、Fedora 等发行版也早已默认切换。PipeWire 对 PulseAudio 客户端的兼容做得已经非常稳定,也就是说你不需要改变任何现有应用的使用方式。
唯一可能需要保留 PulseAudio 的场景是:某些老版本的专业音频程序没有适配 pipewire-pulse 的低延迟行为。遇到这种情况时,可以让程序直接连接 PipeWire 的原生 API,而不是单纯退回 PulseAudio,因为 PipeWire 对专业音频支持更完整。
6.3 开源组件选型的基本原则
经过前面这些讨论,你会发现真正成熟的生态策略是“留好兼容层,啃好硬骨头”。具体到实际项目选型,有几点建议:
- 优先选择有多公司背书的项目:像 Wayland、PipeWire 这类基础组件,背后有多个 Linux 桌面发行版、显卡厂商和云厂商共同贡献,比单一个人维护项目更稳定。
- 安装后先确认服务是否接管:不要默认自己用的是新组件,动手查一遍。比如用
pactl info查看音频服务名,用echo $XDG_SESSION_TYPE查看当前会话类型。 - 遇到问题先看环境变量,再改配置:很多桌面程序问题都出在
QT_QPA_PLATFORM、XDG_SESSION_TYPE、WAYLAND_DISPLAY等环境变量上。 - 备份是不可省略的步骤:切换会话、修改 gdm 配置、更换音频服务,都可能让系统进入无法登录或无声的状态。任何变更前先备份配置,尤其是
/etc/gdm3/custom.conf这类关键文件。 - 升级驱动和工具链后要回归测试:Wayland 对显卡驱动版本的敏感度远高于 X11,嵌入式开发中编译工具链升级也可能带来头文件找不到的新问题。建议每次升级后跑一遍自己项目里的关键用例。
6.4 从“慢慢关闭”到“慢慢完成”
回到开头那个话题:Wayland、PipeWire 和开源生态,到底有没有在“慢慢关闭”?
我的判断是:没有关闭,而是在换挡。老的协议在慢慢退到后台,新的协议在慢慢接管;老的应用在慢慢被兼容层托住,新的应用在慢慢用上原生能力。这个过程中确实会产生很多阵痛和报错,但也正因为经历了这种折腾,Linux 桌面才能在安全模型、音频体验和高分屏支持上往前走一大步。
如果你还在 X11 和 Wayland 之间犹豫,建议先了解自己最常做的操作属于哪一类。如果只是写代码、看网页、用办公软件,直接切成 Wayland 不会有太大影响。如果重度依赖远程桌面或者老显卡,那就先留在 X11,等时机成熟再切。
无论你选择哪一种,都要记得:“慢”是迁移过程中的正常状态,不是项目死亡的信号。老技术会在兼容层里继续陪伴你很长时间,新技术也会在频繁迭代中逐步补齐短板。这不正是开源生态最有意思的地方吗?