我试图通过将所需的.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.so
,libQt5Core.so
等。这些文件位于我的应用程序路径中,但我怀疑libqxcb.so
无法在那里找到它们因此它失败了。我有可能解决这个问题吗?
如果我使用以下脚本运行应用程序,它可以工作(注意:Ct
是可执行文件的名称):
#!/bin/sh
DIR="$( cd "$( dirname "$0" )" && pwd )"
cd $DIR
LD_LIBRARY_PATH=LD_LIBRARY_PATH:. ./Ct
但我希望在不必使用脚本来运行应用程序的情况下实现此目的。
答案 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