共计 2086 个字符,预计需要花费 6 分钟才能阅读完成。
在 Kylin 系统上编译 Qt 工程时,经常会遇到这样的错误提示:

Cannot load library xcb: (xcb: 无法打开共享对象文件: 没有那个文件或目录)
或者类似这样的错误:
QLibraryPrivate::loadPlugin failed on "xcb" : "Cannot load library xcb: (xcb: 无法打开共享对象文件: 没有那个文件或目录)"
技术原理
- XCB 在 Qt 图形栈中的角色
- XCB(X Protocol C-language Binding)是 Qt 在 Linux 平台上的默认显示后端
- 负责 Qt 应用与 X Window 系统的通信
-
比传统的 Xlib 更高效、更模块化
-
Kylin 系统与标准 Linux 发行版的差异
- Kylin 基于 Ubuntu/Debian 但进行了深度定制
- 默认安全策略更严格,包括对动态库加载的限制
-
部分库文件路径与标准发行版不同
-
LD_LIBRARY_PATH 与 sandbox 的关联
- Kylin 的 sandbox 机制会限制环境变量的继承
- LD_LIBRARY_PATH 可能被过滤导致库查找失败
- 需要显式配置 sandbox 允许特定环境变量传递
解决方案
1. 配置 sandbox 环境变量
-
首先确认 xcb 相关库已安装:
sudo apt install libxcb-xinerama0 libxcb-icccm4 libxcb-image0 libxcb-keysyms1 libxcb-render-util0 -
创建或修改 sandbox 配置文件(通常位于~/.config/sandbox.conf 或 /etc/sandbox.conf):
[default] features=allow-sound,allow-x11 whitelist=/usr/lib/x86_64-linux-gnu/libxcb.so.1 inherit=LD_LIBRARY_PATH -
重新加载 sandbox 配置:
sudo systemctl restart sandboxd
2. 验证用的 qmake 编译参数
在工程目录下执行:
qmake "CONFIG+=link_pkgconfig" "PKGCONFIG+=xcb"
或者在.pro 文件中添加:
# Qt 工程文件配置示例
QT += core gui
# 确保链接 xcb 相关库
CONFIG += link_pkgconfig
PKGCONFIG += xcb xcb-xinerama
# 调试信息
DEFINES += QT_DEBUG_PLUGINS
3. 动态库依赖检查
使用 ldd 检查依赖关系:
ldd your_qt_app | grep xcb
正常应该能看到类似输出:
libxcb.so.1 => /usr/lib/x86_64-linux-gnu/libxcb.so.1 (0x00007f8c4a3d0000)
代码示例
.pro 文件配置
# 必须的基础模块
QT += core gui widgets
# 启用 xcb 平台插件
QTPLUGIN += qxcb
# 调试插件加载
DEFINES += QT_DEBUG_PLUGINS
# 链接 xcb 库
unix:!macx {
LIBS += -lxcb -lxcb-xinerama
QMAKE_LFLAGS += -Wl,--rpath=/usr/lib/x86_64-linux-gnu
}
main.cpp 调试片段
#include <QApplication>
#include <QDebug>
int main(int argc, char *argv[])
{qDebug() << "Starting application...";
// 打印平台插件路径
qDebug() << "Plugin paths:" << QApplication::libraryPaths();
QApplication a(argc, argv);
// 检查平台插件
qDebug() << "Platform name:" << QGuiApplication::platformName();
// ... 你的应用代码
return a.exec();}
避坑指南
- 段错误排查
- 如果遇到段错误,先检查库版本是否匹配
- 使用
gdb调试,查看崩溃时的调用栈 -
确认没有混合使用不同 Qt 版本的库
-
多版本 Qt 共存
- 使用
qtchooser管理不同 Qt 版本 - 或者在.pro 文件中显式指定 Qt 版本路径
-
确保环境变量 PATH 和 LD_LIBRARY_PATH 指向正确的 Qt 版本
-
其他常见问题
- 检查
/etc/ld.so.conf是否包含 xcb 库路径 - 执行
sudo ldconfig更新库缓存 - 确保没有缺少其他依赖库
进阶调试
- 观察环境变量影响
- 尝试在不同环境变量设置下运行程序
-
比较
LD_DEBUG=libs ./your_app的输出差异 -
使用 strace 工具
strace -e openat ./your_app 2>&1 | grep xcb这会显示程序尝试加载 xcb 库的所有操作
-
检查 Qt 插件加载
- 设置
QT_DEBUG_PLUGINS=1查看详细插件加载信息 - 检查
QApplication::libraryPaths()返回的路径是否正确
通过以上步骤,应该能解决大部分 Kylin 系统下 Qt xcb 加载失败的问题。如果仍有问题,建议检查系统日志 (/var/log/syslog) 获取更多线索。
正文完
