“无法加载平台插件”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.0
, libxcb-image.so.0
, libxcb-icccm.so.4
, libxcb-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!