"Failed to load platform plugin "xcb" " while launching qt5 app on linux without qt installed

I wrote application for linux which uses Qt5.

But when I am trying to launch it on the linux without Qt SDK installed, the output in console is:

Failed to load platform plugin "xcb". Available platforms are:

How can I fix this? May be I need to copy some plugin file? When I use ubuntu with Qt5 installed, but I rename Qt directory, the same problem occurs. So, it uses some file from Qt directory...

UPDATE: when I create in the app dir "platforms" folder with the file libqxcb.so, the app still doesnot start, but the error message changes:

Failed to load platform plugin "xcb". Available platforms are:

xcb

How can this happen? How can platform plugin be available but can't be loaded?

297240 次浏览

Since version 5, Qt uses a 平台抽象系统 to abstract from the underlying platform.

每个平台的实现都由插件提供。对于 X11它是 XCB 插件。有关依赖项的更多信息,请参见 X11要求的 Qt

Use ldd (man ldd) to show shared library dependencies. Running this on libqxcb.so

.../platforms$ ldd libqxcb.so

显示 xcb 除了依赖于 libQt5Core.so.5和 libQt5Gui.so.5(以及许多其他系统库)之外,还依赖于 libQt5DBus.so.5。将 libQt5DBus.so.5添加到您的共享库集合中,您就应该准备好继续前进了。

我将所有 Qt 的内容静态链接到我的开源项目的通用 Linux 版本。这样生活会轻松一点。您只需要首先构建 Qt 库的静态版本。当然,由于许可问题,这不能应用于封闭源代码软件。在 Linux 上部署 Qt5应用程序目前有点问题,因为例如,Ubuntu 12.04在包存储库中没有 Qt5库。

如前所述,您需要确保在部署应用程序时安装平台插件。根据您希望如何部署,有两种方法可以告诉您的应用程序平台插件(例如 Platform/plugins/libqxcb.so)在运行时的位置,这两种方法可能对您有用。

第一种方法是通过 QT _ QPA _ PLATFORM _ PLUGIN _ PATH 变量将路径导出到目录。

QT_QPA_PLATFORM_PLUGIN_PATH=path/to/plugins ./my_qt_app

或者

export QT_QPA_PLATFORM_PLUGIN_PATH=path/to/plugins
./my_qt_app

另一种选择是在可执行文件所在的目录中创建一个 qt.conf 文件。其内容包括:

[Paths]
Plugins=/path/to/plugins

关于这方面的更多信息可以找到 给你使用 qt.conf

在我的例子中,我需要在 Ubuntu 虚拟机客户端上部署两个 Qt 应用程序。一个是命令行(“ app”) ,另一个是基于 GUI (“ app _ GUI”)。

I used "ldd app" to find out what the required libs are, and copied them 给 Ubuntu 的访客。 虽然命令行可执行文件“ app”工作正常,但是基于 GUI 的可执行文件崩溃了 the "Failed to load platform plugin "xcb" error. I checked ldd for libxcb.so, but this too had no missing dependencies.

问题似乎是,当我复制所有正确的库时,我不小心也复制了客户系统中已经存在的库。.这意味着(a)首先不需要复制它们,(b)更糟糕的是,复制它们会导致安装库之间的不兼容性。 更糟糕的是,它们不能被 ldd 探测到,就像我说的. 。

The solution? Make sure that you copy libraries shown as missing by ldd and 绝对没有额外的库.

我在安装 Viber 之后也遇到了同样的问题,它在 /opt/viber/plugins/中有所有需要的 qt 库。 我检查了 /opt/viber/plugins/platforms/libqxcb.so的依赖项,发现缺少依赖项,它们是 libxcb-render.so.0libxcb-image.so.0libxcb-icccm.so.4libxcb-xkb.so.1 So I resolved my issue by installing missing packages with this libraries:

apt-get install libxcb-xkb1 libxcb-icccm4 libxcb-image0 libxcb-render-util0

我尝试在预安装 Qt 5.5的 Ubuntu 16.04 LTS 上启动用 Qt 5.7编译的二进制文件。没用。

首先,我像这里建议的那样用 ldd检查了二进制文件本身,并满足了所有“未找到”的依赖关系。然后这个臭名昭著的 This application failed to start because it could not find or load the Qt platform plugin "xcb"错误被抛出。

如何在 Linux 中解决这个问题

首先,您应该在二进制文件所在的位置创建 platforms目录,因为它是 Qt 查找 XCB 库的位置。收到 libqxcb.so。我想知道为什么其他答案的作者没有提到这一点。

Then you may want to run your binary with QT_DEBUG_PLUGINS=1 environment variable set to check which dependencies of libqxcb.so are not satisfied. (You may also use ldd for this as suggested in the accepted answer).

命令输出可能如下所示:

me@xerus:/media/sf_Qt/Package$ LD_LIBRARY_PATH=. QT_DEBUG_PLUGINS=1 ./Binary
QFactoryLoader::QFactoryLoader() checking directory path "/media/sf_Qt/Package/platforms" ...
QFactoryLoader::QFactoryLoader() looking at "/media/sf_Qt/Package/platforms/libqxcb.so"
Found metadata in lib /media/sf_Qt/Package/platforms/libqxcb.so, metadata=
{
"IID": "org.qt-project.Qt.QPA.QPlatformIntegrationFactoryInterface.5.3",
"MetaData": {
"Keys": [
"xcb"
]
},
"className": "QXcbIntegrationPlugin",
"debug": false,
"version": 329472
}




Got keys from plugin meta data ("xcb")
loaded library "/media/sf_Qt/Package/platforms/libqxcb.so"
QLibraryPrivate::loadPlugin failed on "/media/sf_Qt/Package/platforms/libqxcb.so" : "Cannot load library /media/sf_Qt/Package/platforms/libqxcb.so: (/usr/lib/x86_64-linux-gnu/libQt5DBus.so.5: version `Qt_5' not found (required by ./libQt5XcbQpa.so.5))"
This application failed to start because it could not find or load the Qt platform plugin "xcb"
in "".


Available platform plugins are: xcb.


Reinstalling the application may fix this problem.
Aborted (core dumped)

注意失败的 libQt5DBus.so.5库。将它复制到库路径,在我的例子中,它与我的二进制文件所在的目录相同(因此是 LD_LIBRARY_PATH=.)。重复此过程,直到满足所有依赖项。

附注: 感谢 这个答案QT_DEBUG_PLUGINS=1的作者。

Ubuntu 16.0464位。 我无缘无故就遇到了麻烦。前一天晚上,我看了一部电影在我的视频兰实例,那天晚上,我想看另一个与视频兰。VLC 只是不想运行,因为进入问题的错误。 我谷歌了一下,我发现它解决了我的问题的解决方案: 从现在开始,VLC 就像以前一样可以运行。解决办法是这样的命令:

sudo ln -sf /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/ /usr/bin/

I am not able to explain what are its consequencies, but I know it creates some missing symbolic link.

Sudo ln-sf/usr/lib/... . “ Adapt-it”... ./qt5/plugins/Platform//usr/bin/

It creates the symbolic link it's missed. Good for QT ! Good for VLC !!

我尝试了每个答案的主要部分,但没有用。最后为我解决这个问题的方法是导出以下环境变量:

LD_LIBRARY_PATH=/usr/local/lib:~/Qt/5.9.1/gcc_64/lib
QT_QPA_PLATFORM_PLUGIN_PATH=~/Qt/5.9.1/gcc_64/plugins/

I like the solution with qt.conf.

Put qt.conf near to the executable with next lines:

[Paths]
Prefix = /path/to/qtbase

而且效果非常好: ^)

举个实际的例子:

[Paths]
Prefix = /home/user/SDKS/Qt/5.6.2/5.6/gcc_64/

关于这个的文档在这里: https://doc.qt.io/qt-5/qt-conf.html

也许这个信息会有帮助。我使用的是 Ubuntu 18.04,当我尝试用 ppa 方法安装 克丽塔时,我得到了这个错误:

这个应用程序启动失败,因为它无法找到或加载 Qt 平台插件“ xcb”in”。

可用的平台插件包括: linuxfb、 minialegl、 offscreen、 wayland-egl、 wayland、 xcb。

Reinstalling the application may fix this problem.

流产了

我尝试了所有的解决方案,我发现在这个线程和其他网站没有任何成功。

最后,我发现了一篇文章,作者提到可以使用这个简单的命令激活 qt5的调试工具:

export QT_DEBUG_PLUGINS=1

在添加了这个命令之后,我再次运行 Krita,我得到了同样的错误,但是这次我知道了错误的原因。

Libxcb-xinerama.so 0: 不能打开共享对象文件: 没有这样的文件或目录。

此错误阻止“ xcb”正确加载。因此,解决方案将是安装‘ libxcb-xinerama。0英寸,对吧?但是,当我运行该命令时:

sudo apt install libxcb-xinerama

Lib 已经安装好了。 又怎么了,泰欧?好的,然后我用了一个老把戏:)是的,那个 --reinstall

sudo apt install --reinstall libxcb-xinerama

最后一个命令解决了我的问题。

因此,我花了大约一天的时间试图找出问题所在; 尝试了所有提出的解决方案,但没有一个像安装 xcb 库或导出 Qt 插件文件夹那样有效。建议使用 QT_DEBUG_PLUGINS=1来调试这个问题的解决方案并没有像在答案中那样给我提供直接的见解——相反,我得到了一些关于 Qt5Core 中未解决的符号的信息。

不过,这给了我一个提示: 如果它试图使用来自不同 Qt 安装的不同文件会怎么样?在我的机器上,我在 /home/username/Qt/中安装了标准版本,在我自己编译的项目中安装了一些本地构建(我还在其他地方安装了其他自定义构建工具包)。无论何时我尝试使用任何工具包(由 Qt 维护工具安装或由我自己构建) ,都会得到一个“ xcb 错误”。

解决方案很简单: 通过 CMAKE_PREFIX_PATH提供 Qt 路径,而不是像我一样通过 Qt5_DIR提供 Qt 路径,这样就解决了问题。例如:

cmake .. -DCMAKE_PREFIX_PATH=/home/username/Qt/5.11.1/gcc_64

我遇到了这个问题,直觉告诉我,我把 QT 配置从我的环境中移除了,

rm -rf ~/.config/Qt*

然后我启动了 qtcreate,它使用机器的现有状态重新配置了自己。它不再记得我的项目在哪里,但这只意味着我必须“第一次”浏览它们。

但更重要的是,它为自己构建了一组连贯的库路径,这样我就可以重新构建并运行我的项目可执行文件,而不会丢失 xcb 或 qxcb 库。

这个问题可能有很多原因,关键是要使用

export QT_DEBUG_PLUGINS=1

在运行 Qt 应用程序之前。然后,检查输出,它将指出错误的方向。对我来说是:

Cannot load library /opt/nao/plugins/platforms/libqxcb.so: (/opt/nao/bin/../lib/libz.so.1: version `ZLIB_1.2.9' not found (required by /usr/lib/x86_64-linux-gnu/libpng16.so.16))

但是这个问题可以在不同的线程中解决。

我遇到了一个非常类似的问题,出现了相同的错误消息。首先,使用命令行命令打开 Qt Debug 打印机来调试一些程序:

导出 QT _ DEBUG _ PLUGINS = 1

并重新运行应用程序。对我来说,这揭示了以下内容:

”无法加载 library/home/.../miniconda3/lib/python3.7/site-package/PyQt5/Qt/plugins/Platform/libqxcb.so: ( libxkbcommon-x11.so 0: 无法打开共享对象文件: 没有这样的文件或目录)

”无法加载 library/home/.../miniconda3/lib/python3.7/site-package/PyQt5/Qt/plugins/Platform/libqxcb.so: ( libxkbcommon-x11.so 0: 无法打开共享对象文件: 没有这样的文件或目录)

事实上,我错过了 libxkbcommon-x11。0和 libxkbcommon-x11。所以0。接下来,使用 linux 命令行中的 dpkg 检查您的体系结构。(对我来说,命令“ arch”给出了一个不同的、没有帮助的结果)

Dpkg —— print-Architecture # result for me: amd64

然后我谷歌了“ libxkbcommon-x11”。因此,0 ubuntu 18.04 amd64”,libxkbcommon-x11也是如此。那么0,就得到了这些包的 packages.ubuntu.com。这告诉我,回想起来并不奇怪,我丢失了名为 libxkbcommon-x11-0和 libxkbcommon0的软件包,并且安装这些软件包将包含所需的文件,但是开发版本不包含这些文件。那么解决办法是:

sudo apt-get update

Sudo apt-get install libxkbcommon0

Sudo apt-get install libxkbcommon-x11-0

在我的案例中,缺少头文件是 libxcb没有被 Qt 构建的原因。根据 https://wiki.qt.io/Building_Qt_5_from_Git#Linux.2FX11安装它们解决了这个问题:

yum install libxcb libxcb-devel xcb-util xcb-util-devel mesa-libGL-devel libxkbcommon-devel

你只需要

pip uninstall PyQt5

还有

conda install pyqt

Most of the problem of pyqt can be fixed by this simplest solution.

Folks trying to get this started on Ubuntu 20.04 please try to run this and see if this solves the problem. This worked for me

sudo apt-get update -y
sudo apt-get install -y libxcb-xinerama0

我也遇到过同样的情况,但是是在 Ubuntu 20.04 VM 上。

DR: 检查文件权限。

我所做的:

  • 我将所需的 Qt 库复制到 /usr/local/lib/x86_64-linux-gnu/并将其添加到 LD_LIBRARY_PATH
  • 我将平台文件夹从 Qt 复制到我的应用程序目录,并将其添加到 QT_PLUGIN_PATH
  • 我在可执行文件和令人讨厌的 libqxcb.so (ldd libqxcb.so)中运行 ldd,它会抱怨一些依赖项,尽管 ldconfig将它们列为找到的依赖项。
        linux-vdso.so.1 (0x00007ffee19af000)
libQt5XcbQpa.so.5 => not found
libfontconfig.so.1 => /lib/x86_64-linux-gnu/libfontconfig.so.1 (0x00007f7cb18fb000)
libfreetype.so.6 => /lib/x86_64-linux-gnu/libfreetype.so.6 (0x00007f7cb183c000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f7cb1820000)
libQt5Gui.so.5 => /usr/local/lib/x86_64-linux-gnu/libQt5Gui.so.5 (0x00007f7cb0fd4000)
libQt5DBus.so.5 => not found
  • 我使用了 export QT_DEBUG_PLUGINS=1进一步的信息。它抱怨丢失的文件,虽然他们在那里。

我发现:

  • 由于某种原因,当通过共享文件夹复制到 VM 时,文件权限不正确。
  • 因此,我跑: sudo chmod 775 *上的解说词,瞧。

我通过这个 https://github.com/NVlabs/instant-ngp/discussions/300解决了这个问题

pip uninstall opencv-python
pip install opencv-python-headless

这似乎是 cv2 Python 包以及它如何在 Qt 中循环的一个问题