“无法加载平台插件”xcb“”,而没有安装qt在Linux上启动qt5应用程序

我为使用Qt5的linux编写了应用程序。

但是当我试图在未安装Qt SDK的linux上启动它时,控制台中的输出是:

无法加载平台插件“xcb”。 可用的平台是:

我该如何解决这个问题? 可能是我需要复制一些插件文件? 当我使用安装Qt5的Ubuntu,但我重命名Qt目录,同样的问题发生。 所以,它使用Qt目录中的一些文件…

更新:当我在应用程序目录中创build与文件libqxcb.so文件夹“平台”,应用程序仍然不启动,但错误消息更改:

无法加载平台插件“xcb”。 可用的平台是:

XCB

这怎么可能发生? 平台插件如何可用,但无法加载?

使用ldd(man ldd)显示共享库依赖关系。 在libqxcb.so上运行

 .../platforms$ ldd libqxcb.so 

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

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

首先是通过QT_QPA_PLATFORM_PLUGIN_PATHvariables将path导出到目录。

 QT_QPA_PLATFORM_PLUGIN_PATH=path/to/plugins ./my_qt_app 

要么

 export QT_QPA_PLATFORM_PLUGIN_PATH=path/to/plugins ./my_qt_app 

另一种select,我更喜欢在你的可执行文件所在的目录下创build一个qt.conf文件。 其内容将是:

 [Paths] Plugins=/path/to/plugins 

有关这方面的更多信息可以在这里和使用qt.conf中find

从版本5开始,Qt使用平台抽象系统(QPA)从底层平台进行抽象。

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

我试着在Qt 5.5预装的Ubuntu 16.04 LTS上启动我的二进制文件,编译为Qt 5.7。 预计,它不会按原样工作。

起初,我使用ldd检查了二进制文件,并且满足了所有“未find”的依赖关系。 然后这个臭名昭着的This application failed to start because it could not find or load the Qt platform plugin "xcb"错误被抛出。

在Linux上应该做些什么来解决这个问题。

起初你应该在你的二进制文件中创buildplatforms目录,因为它是Qt寻找XCB库的地方。 libqxcb.so那里复制libqxcb.so 。 我想知道为什么其他答案的作者没有提到这一点。

那么你可能想运行你的二进制文件,设置QT_DEBUG_PLUGINS=1环境variables来检查libqxcb.so依赖关系是否不满意。 (您也可以按照接受的答案中的build议使用ldd 。)

命令输出可能如下所示:

 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库。 将它复制到你的库path,在我的情况下,它是我的二进制文件是相同的目录(因此LD_LIBRARY_PATH=. )。 重复这个过程,直到满足所有依赖关系。

PS谢谢QT_DEBUG_PLUGINS=1 这个答案的作者。

Ubuntu 16.04 64bit。 我明显没有理由解决了这个问题。 在我观看VideoLan实例的电影之前的那个晚上,那天晚上我想用VideoLan观看另一个电影。 VLC只是不想运行,因为错误的问题。 我google了一下,我发现解决scheme,它解决了我的问题:从现在开始,VLC可以像以前一样运行。 解决方法是这样的命令:

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

我无法解释它的结果是什么,但我知道它造成了一些缺失的符号链接。

我试了每个答案的主要部分,都无济于事。 最后为我解决的是导出下列环境variables:

 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/ 

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

我使用“ldd应用程序”来找出所需的库,并将它们复制到Ubuntu客户端。 虽然命令行可执行文件“app”工作正常,但是基于GUI的可执行文件崩溃,给出了“Failed to load platform plugin”xcb“错误,我检查了ldd是否有libxcb.so,但是也没有丢失依赖关系。

问题似乎是,当我拷贝了所有正确的库时,我不小心复制了已经存在于客户系统上的库。这意味着(a)他们不必复制它们,(b) ,复制它们会在安装库之间产生不兼容性。 更糟糕的是,像我说的那样,他们不能被ldd检测到。

解决scheme? 确保你复制了显示为ldd缺less的库,并且绝对没有额外的库

安装Viber后,我遇到了同样的问题。 它有/opt/viber/plugins/所有qt库。 我检查了/opt/viber/plugins/platforms/libqxcb.so依赖关系,发现缺less依赖关系。 他们是libxcb-render.so.0libxcb-image.so.0libxcb-icccm.so.4libxcb-xkb.so.1所以我解决了我的问题,安装缺less的包与这些库:

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

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

尝试从lib文件夹中删除libstdc ++ *。

检查参考 。

sudo ln -sf /usr/lib/…."adapt-it"…./qt5/plugins/platforms/ / usr / bin /

它创build了错过的符号链接。 适合QT! 好的VLC!