“在没有安装qt的Linux上启动qt5 app时,无法加载平台插件”xcb“”

时间:2013-06-14 10:22:51

标签: linux qt xcb

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

但是当我尝试在没有安装Qt SDK的情况下在Linux上启动它时,控制台中的输出是:

  

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

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

更新: 当我在应用程序dir“platforms”文件夹中创建文件 libqxcb.so 时,应用程序仍然无法启动,但错误消息更改:

  

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

     

XCB

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

17 个答案:

答案 0 :(得分:49)

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

.../platforms$ ldd libqxcb.so

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

答案 1 :(得分:45)

如前所述,您需要确保在部署应用程序时安装平台插件。根据您希望如何部署内容,有两种方法可以告诉您的应用程序平台插件(例如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

有关此问题的更多信息,请访问hereat using qt.conf

答案 2 :(得分:19)

我尝试在Ubuntu 16.04 LTS上使用Qt 5.7编译我的二进制文件,其中预装了Qt 5.5。预计它不会按原样运作。

首先,我按照此处的建议使用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=.)。重复此过程,直到满足所有依赖关系。

P.S。感谢QT_DEBUG_PLUGINS=1的作者protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(resultCode==RESULT_OK) { if(requestCode==CAMERA_REQUEST) { String path= (String) data.getExtras().get("data"); File file = new File(path); } } }

答案 3 :(得分:9)

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

Folding

我无法解释其后果是什么,但我知道它会创建一些缺失的符号链接。

答案 4 :(得分:8)

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

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

答案 5 :(得分:8)

我尝试了每个答案的主要部分,但没有用。最后为我修复的是导出以下环境变量:

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/ 

答案 6 :(得分:3)

我遇到了一个非常类似的问题,并带有相同的错误消息。首先,通过使用命令行命令打开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。接下来,从linux命令行使用dpkg检查您的体系结构。 (对我来说,“ arch”命令给出了不同且无益的结果)

dpkg --print-architecture #result:amd64

然后我在Google上搜索了“ libxkbcommon-x11.so.0 ubuntu 18.04 amd64”,同样也搜索了libxkbcommon-x11.so.0,它在package.ubuntu.com上生成了这些软件包。毫无疑问,这告诉了我,我缺少名为libxkbcommon-x11-0和libxkbcommon0的软件包,并且安装这些软件包将包含所需的文件,但dev版本不会。然后是解决方案:

sudo apt-get更新

sudo apt-get install libxkbcommon0

sudo apt-get install libxkbcommon-x11-0

答案 7 :(得分:3)

这可能会有所帮助。我正在使用Ubuntu 18.04,并且使用ppa方法安装 Krita 时。我收到此错误:

  

此应用程序无法启动,因为无法在“”中找到或加载Qt平台插件“ xcb”。

     

可用的平台插件有:linuxfb,minimum,minimlegl,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

我安装了lib。所以我使用了一个古老的技巧--reinstall

sudo apt install --reinstall libxcb-xinerama

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

答案 8 :(得分:1)

在我的情况下,缺少头文件是{t {1}}不是Qt构建的原因。根据{{​​3}}安装它们可以解决此问题:

libxcb

答案 9 :(得分:1)

因此,我花了大约一天的时间来弄清楚问题出在哪里;尝试了所有建议的解决方案,但没有一个能像安装xcb库或导出Qt plugins文件夹那样工作。建议使用QT_DEBUG_PLUGINS=1来调试问题的解决方案并没有像答案中那样为我提供直接的见解-而是我从Qt5Core中获得了有关未解析符号的信息。

这给了我一个提示:如果它试图使用来自不同Qt安装的不同文件怎么办?在我的机器上,我在/home/username/Qt/中安装了标准版本,并且在我的项目中由我自己编译了一些本地版本(在其他位置也有其他自定义生成的工具包)。每当我尝试使用任何套件(由Qt维护工具安装或由我自己构建)时,都会出现“ xcb错误”。

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

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

答案 10 :(得分:1)

安装Viber后我遇到了同样的问题。它在/opt/viber/plugins/中都需要qt库。 我检查了/opt/viber/plugins/platforms/libqxcb.so的依赖项,发现缺少依赖项。他们是libxcb-render.so.0libxcb-image.so.0libxcb-icccm.so.4libxcb-xkb.so.1 所以我通过使用这个库安装缺少的包解决了我的问题:

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

答案 11 :(得分:1)

就我而言,我需要在Ubuntu virtualbox guest上部署两个Qt应用程序。一个是命令行(“app”),另一个是GUI_based(“app_GUI”)。

我用“ldd app”找出所需的库是什么,然后复制它们 到Ubuntu的客人。 虽然命令行可执行文件“app”工作正常,但基于GUI的可执行文件崩溃了,给出了 “无法加载平台插件”xcb“错误。我检查了ldd for libxcb.so,但这也没有丢失依赖项。

问题似乎是,当我复制了所有正确的库时,我偶然也复制了已经存在于客户系统的库..这意味着(a)他们不需要首先复制它们( b)更糟糕的是,复制它们会在安装库之间产生不兼容性。 更糟糕的是,就像我说的那样,ldd无法检测到它们。

解决方案?确保复制ldd缺少的库和绝对没有额外的库

答案 12 :(得分:0)

我喜欢qt.conf的解决方案。

qt.conf放在可执行文件附近,并显示下一行:

[Paths]
Prefix = /path/to/qtbase

它就像一个魅力:^)

答案 13 :(得分:0)

我遇到了这个问题,并且直觉上我从我的环境中删除了Qt Configs。即

rm -rf ~/.config/Qt*

然后,我启动了qtcreator,并使用计算机的现有状态对其进行了重新配置。它不再想起我的项目在哪里,但这只是意味着我不得不“第一次”浏览它们。

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

答案 14 :(得分:0)

可能有很多原因导致此问题。关键是要使用

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

答案 15 :(得分:0)

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

答案 16 :(得分:-4)

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

它创建了它错过的符号链接。对QT有好处!适合VLC !!