我为使用 Qt5 的 linux 编写了应用程序。
但是当我试图在没有安装 Qt SDK 的情况下在 linux 上启动它时,控制台中的输出是:
无法加载平台插件“xcb”。可用平台有:
我怎样才能解决这个问题?可能我需要复制一些插件文件吗?当我使用安装了 Qt5 的 ubuntu,但我重命名 Qt 目录时,会出现同样的问题。所以,它使用Qt目录中的一些文件......
更新:当我使用文件 libqxcb.so 在应用程序目录“平台”文件夹中创建时,应用程序仍然无法启动,但错误消息发生了变化:
无法加载平台插件“xcb”。可用平台有:xcb
这怎么可能发生?平台插件如何可用但无法加载?
eveonline.sh
,而不是 eveonline
- 启动器的所有库都与特殊版本捆绑在一起。
使用 ldd (man ldd) 显示共享库依赖项。在 libqxcb.so 上运行它
.../platforms$ ldd libqxcb.so
表明 xcb 依赖于 libQt5DBus.so.5 以及 libQt5Core.so.5 和 libQt5Gui.so.5(以及许多其他系统库)。将 libQt5DBus.so.5 添加到您的共享库集合中,您应该准备好继续前进。
如前所述,您需要确保在部署应用程序时安装平台插件。根据您想要部署的方式,有两种方法可以告诉您的应用程序平台插件(例如,platforms/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
有关这方面的更多信息,请参阅 here 和 at using qt.conf
LD_LIBRARY_PATH
不起作用,但 QT_QPA_PLATFORM_PLUGIN_PATH
成功了。超级感谢。
我尝试在预装了 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
复制到那里。我想知道为什么其他答案的作者没有提到这一点。
然后,您可能希望在设置 QT_DEBUG_PLUGINS=1
环境变量的情况下运行二进制文件,以检查不满足 libqxcb.so
的哪些依赖项。 (您也可以按照接受的答案中的建议使用 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
库。将其复制到您的库路径,在我的情况下,它与我的二进制文件所在的目录相同(因此为 LD_LIBRARY_PATH=.
)。重复此过程,直到满足所有依赖项。
PS 感谢 this answer 的作者为 QT_DEBUG_PLUGINS=1
。
我尝试了每个答案的主要部分,但无济于事。最终为我解决的问题是导出以下环境变量:
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/
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib/x86_64-linux-gnu/
。不幸的是,它只修复了我的 VLC,而不是具有相同错误的 Virtualbox...
Ubuntu 16.04 64 位。我显然没有任何理由遇到问题。我在 VideoLan 实例上观看电影的前一天晚上,那天晚上我想用 VideoLan 再看一部电影。由于问题中的错误,VLC 只是不想运行。我谷歌了一下,我找到了解决我的问题的解决方案:从现在开始,VLC 就像以前一样可以运行。解决方案是这个命令:
sudo ln -sf /usr/lib/x86_64-linux-gnu/qt5/plugins/platforms/ /usr/bin/
我无法解释它的后果是什么,但我知道它会创建一些缺失的符号链接。
-f
--force
标志。这可能会导致其他问题。
从版本 5 开始,Qt 使用 platform abstraction system (QPA) 从底层平台进行抽象。
每个平台的实现由插件提供。对于 X11,它是 XCB 插件。有关依赖项的更多信息,请参阅 Qt for X11 requirements。
这个问题可能有很多原因。关键是用
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))
但这是在不同的线程中解决的。参见例如 https://stackoverflow.com/a/50097275/2408964。
可能这些信息会有所帮助。我在 Ubuntu 18.04 上,当我尝试使用 ppa 方法安装 Krita 时,出现以下错误:
此应用程序无法启动,因为它无法在“”中找到或加载 Qt 平台插件“xcb”。可用的平台插件有:linuxfb、minimal、minimalegl、offscreen、wayland-egl、wayland、xcb。重新安装应用程序可能会解决此问题。中止
我尝试了在此线程和其他网站中找到的所有解决方案,但均未成功。
最后,我找到了一个帖子,作者提到可以使用这个简单的命令来激活 qt5 的调试工具:
export QT_DEBUG_PLUGINS=1
添加此命令后,我再次运行 krita,我得到了同样的错误,但是这次我知道了该错误的原因。
libxcb-xinerama.so.0:无法打开共享对象文件:没有这样的文件或目录。
此错误会阻止“xcb”正确加载。那么,解决方案将是安装“libxcb-xinerama.so.0”对吗?但是,当我运行命令时:
sudo apt install libxcb-xinerama
该库已经安装。 现在是什么 Teo? 好吧,然后我用了一个老把戏 :) 是的,那个--reinstall
sudo apt install --reinstall libxcb-xinerama
TLDR:最后一个命令解决了我的问题。
我遇到了一个非常相似的问题,带有相同的错误消息。首先,通过使用命令行命令打开 Qt Debug 打印机来调试一些:
导出 QT_DEBUG_PLUGINS=1
并重新运行应用程序。对我来说,这揭示了以下内容:
“无法加载库 /home/.../miniconda3/lib/python3.7/site-packages/PyQt5/Qt/plugins/platforms/libqxcb.so:(libxkbcommon-x11.so.0:无法打开共享对象文件:没有这样的文件或目录)”
“无法加载库 /home/.../miniconda3/lib/python3.7/site-packages/PyQt5/Qt/plugins/platforms/libqxcb.so:(libxkbcommon-x11.so.0:无法打开共享对象文件:没有这样的文件或目录)”
事实上,我错过了 libxkbcommon-x11.so.0 和 libxkbcommon-x11.so.0。接下来,使用 dpkg 从 linux 命令行检查您的架构。 (对我来说,命令“arch”给出了不同且无益的结果)
dpkg --print-architecture #result for me: amd64
然后我搜索了“libxkbcommon-x11.so.0 ubuntu 18.04 amd64”,同样搜索了 libxkbcommon-x11.so.0,它会在 packages.ubuntu.com 上生成这些包。这告诉我,回想起来毫不奇怪,我缺少名为 libxkbcommon-x11-0 和 libxkbcommon0 的软件包,并且安装这些软件包将包含所需的文件,但开发版本不会。然后解决方案:
sudo apt-get 更新 sudo apt-get install libxkbcommon0 sudo apt-get install libxkbcommon-x11-0
所以,我花了大约一天的时间试图找出问题所在;尝试了所有建议的解决方案,但没有一个像安装 xcb 库或导出 Qt 插件文件夹一样有效。建议使用 QT_DEBUG_PLUGINS=1
来调试问题的解决方案并没有像答案那样为我提供直接的洞察力——相反,我得到了关于 Qt5Core 中未解决符号的一些信息。
不过,这给了我一个提示:如果它试图使用来自不同 Qt 安装的不同文件怎么办?在我的机器上,我在 /home/username/Qt/
中安装了标准版本,并在我自己编译的项目中安装了一些本地构建(我在其他位置也有其他自定义构建的工具包)。每当我尝试使用任何工具包(由 Qt 维护工具安装或自己构建)时,我都会收到“xcb 错误”。
解决方案很简单:通过 CMAKE_PREFIX_PATH
提供 Qt 路径,而不是像我那样通过 Qt5_DIR
,它解决了问题。例子:
cmake .. -DCMAKE_PREFIX_PATH=/home/username/Qt/5.11.1/gcc_64
安装 Viber 后,我遇到了同样的问题。它在 /opt/viber/plugins/
中有所有必需的 qt 库。我检查了 /opt/viber/plugins/platforms/libqxcb.so
的依赖项,发现缺少依赖项。它们是 libxcb-render.so.0
、libxcb-image.so.0
、libxcb-icccm.so.4
、libxcb-xkb.so.1
所以我通过使用以下库安装缺少的软件包来解决我的问题:
apt-get install libxcb-xkb1 libxcb-icccm4 libxcb-image0 libxcb-render-util0
我喜欢 qt.conf
的解决方案。
将 qt.conf
放在可执行文件附近,下一行:
[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
cd path/to/executable; vim qt.conf
,粘贴。保存并退出。
你需要做的就是
pip uninstall PyQt5
和
conda install pyqt
pyqt的大部分问题都可以通过这个最简单的方案解决。
就我而言,我需要在一个 Ubuntu virtualbox 客户机上部署两个 Qt 应用程序。一个是命令行(“app”),另一个是基于 GUI 的(“app_GUI”)。
我使用“ldd app”找出所需的库是什么,并将它们复制到 Ubuntu 来宾。虽然命令行可执行文件“app”工作正常,但基于 GUI 的可执行文件崩溃,出现“无法加载平台插件“xcb”错误。我检查了 ldd 中的 libxcb.so,但这也没有缺少依赖项。
问题似乎是,虽然我确实复制了所有正确的库,但我不小心也复制了来宾系统中已经存在的库。这意味着(a)他们一开始就没有必要复制它们,并且(b)更糟,复制它们会导致安装库之间不兼容。更糟糕的是,就像我说的那样,ldd 无法检测到它们。
解决方案?确保复制 ldd 显示为缺失的库,并且绝对没有额外的库。
在我的情况下,缺少头文件是 Qt 未构建 libxcb
的原因。根据 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
我将所有 Qt 内容静态链接到我的开源项目的通用 Linux 构建。它使生活更轻松。您只需要首先构建 Qt 库的静态版本。当然,由于许可问题,这不能应用于闭源软件。目前在 Linux 上部署 Qt5 应用程序有点问题,因为例如 Ubuntu 12.04,包存储库中没有 Qt5 库。
我遇到了这个问题,预感我从我的环境中删除了 Qt 配置。 IE,
rm -rf ~/.config/Qt*
然后我启动了 qtcreator,它用机器的现有状态重新配置了自己。它不再记得我的项目在哪里,但这只是意味着我必须再次“第一次”浏览它们。
但更重要的是,它为自己构建了一组连贯的库路径,因此我可以重新构建和运行我的项目可执行文件,而不会丢失 xcb 或 qxcb 库。
尝试在 Ubuntu 20.04 上启动此功能的人请尝试运行它,看看是否能解决问题。这对我有用
sudo apt-get update -y
sudo apt-get install -y libxcb-xinerama0
sudo ln -sf /usr/lib/...."adapt-it"..../qt5/plugins/platforms/ /usr/bin/
它创建了它错过的符号链接。适合QT!适合 VLC !
不定期副业成功案例分享
sudo apt-get install libx11-xcb1
解决了这个问题。但是您对使用ldd
的建议使我找到了要安装的正确库。谢谢!ldd
后仍然遇到此问题,请尝试在 Qt 安装中查找plugins/platforms
目录。尝试将整个目录复制到与二进制或共享库文件相同的位置。如果可行,您可以设置LD_LIBRARY_PATH
(hacky),或者如@bossbarber 的回答中所述,设置QT_QPA_PLATFORM_PLUGIN_PATH
。