Qt,Linux,GCC:-Wl,-rpath = $ ORIGIN不适用于平台插件xcb

时间:2016-03-20 18:25:04

标签: c++ linux qt gcc linker

我试图通过将所需的.so文件放入可执行文件目录来部署在Linux上使用gcc编译的C ++应用程序。我添加了链接器标志-Wl,-rpath=$ORIGIN,以便程序可以在它所在的目录中查找链接库。这样可以找到与我的可执行文件直接链接的所有库(通过ldd检查)。

但是,当我尝试启动应用程序时,出现以下错误:

This application failed to start because it could not find or load the Qt platform plugin "xcb".

Available platform plugins are: linuxfb, minimal, offscreen, xcb.

Reinstalling the application may fix this problem.

平台插件位于文件夹./platforms中(相对于可执行路径)。那些显然由Qt加载的其他共享对象文件,其中一个是libqxcb.so。现在,问题是这个文件又取决于libQt5Gui.solibQt5Core.so等。这些文件位于我的应用程序路径中,但我怀疑libqxcb.so无法在那里找到它们因此它失败了。我有可能解决这个问题吗?

如果我使用以下脚本运行应用程序,它可以工作(注意:Ct是可执行文件的名称):

#!/bin/sh

DIR="$( cd "$( dirname "$0" )" && pwd )"
cd $DIR
LD_LIBRARY_PATH=LD_LIBRARY_PATH:. ./Ct

但我希望在不必使用脚本来运行应用程序的情况下实现此目的。

1 个答案:

答案 0 :(得分:1)

qt部署文档对此没有特别的帮助。

解决这个问题的关键是当你查看 libqxcb.so 的ldd输出时,它会进入lib文件夹。

libQt5Core.so.5 => <*>/plugins/platforms/./../../lib/libQt5Core.so.5 (0x00007f5f8374a000)

因此目录结构应如下所示:

app
|-- lib
|   |-- libQt5Core.so.5
|   |-- libQt5Gui.so.5
|   |-- libQt5DBus.so.5
|   |-- libQt5XcbQpa.so.5
|   |-- libicui18n.so.56
|   |-- libicuuc.so.56
|   `-- libicudata.so.56
|-- qt.conf
|-- app_exec
`-- plugins
    `-- platforms
        `-- libqxcb.so

在project.pro中设置lib文件夹的应用程序路径:

unix:!mac{  
    QMAKE_LFLAGS += "-Wl,-rpath,\'\$$ORIGIN/lib\'"
}

最后,您需要为您的应用设置 qt.conf 才能找到插件(默认情况下从平台文件夹中查找):

[Paths]
Prefix=./
Libraries=lib
Plugins=plugins