【问题标题】:Qt, Linux, GCC: -Wl,-rpath=$ORIGIN not working for platform plugin xcbQt、Linux、GCC:-Wl,-rpath=$ORIGIN 不适用于平台插件 xcb
【发布时间】:2016-03-20 18:25:03
【问题描述】:

我正在尝试通过将所需的 .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

但我想实现这一点,而不必使用脚本来运行应用程序。

【问题讨论】:

  • 通过'ldd'检查你的'libqxcb.so',它会给你一个关于你对错过图书馆的怀疑的答案。
  • 我在创建问题时已经这样做了,并且如上所述无法找到它们。问题是为什么它找不到它们以及我如何解决这个问题(除了使用该脚本启动应用程序)。

标签: c++ linux qt gcc linker


【解决方案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 文件夹设置您的应用程序 rpath:

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

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

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

【讨论】:

  • 您好,谢谢您的回复。我一有时间就试试。我不清楚的是目录树中的./bin 是什么。可执行文件仍然进入app 文件夹,对吧?
  • 是的,抱歉,这将是可执行文件,qt.conf 必须与您的可执行文件位于同一目录中 doc.qt.io/qt-5/qt-conf.html
  • 谢谢,就像一个魅力。最重要的部分是带有Libraries=... 行的qt.conf 文件。因此,作为插件加载的共享对象文件也会找到它们的依赖关系。
  • 我只想补充一点:我使用 CMAKE 而不是 QMAKE。添加编译器标志的命令看起来有点不同:set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wl,-rpath='$ORIGIN/lib'")
猜你喜欢
  • 2020-10-05
  • 1970-01-01
  • 2017-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
  • 2016-01-08
  • 2018-01-12
相关资源
最近更新 更多