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

标签 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

但我想在不使用脚本运行应用程序的情况下实现这一点。

最佳答案

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 文件夹设置应用程序 rpath:

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

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

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

关于c++ - Qt、Linux、GCC : -Wl, -rpath=$ORIGIN 不适用于平台插件 xcb,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36117748/

相关文章:

c++ - extern "C"的功能是什么?

c++ - 将指针传递给 C 项目中的 C++ 函数

c++ - 如何在 Linux 上使用#ifdef _DEBUG?

c++ - 获取 QStringList 的前一个元素

c++ - QT QRgb 构建错误

c++ - VirtualBox - 如何编写驱动程序/插件?

java - 运行应用程序时 eclipse 挂起(应用程序运行正常,eclipse 挂起)

linux - 如何 : Conditional include of header file

c++ - 在内存中将 Iplimage 压缩为 jpeg

c++ - Opencv Mat转换为QByteArray