gpt4 book ai didi

c++ - 如何在 QApplication 中应用 QLibraryInfo 中加载的库和插件配置?

转载 作者:太空宇宙 更新时间:2023-11-04 12:30:08 25 4
gpt4 key购买 nike

上下文:我构建了一个 在 OpenSUSE 平台(某些 Linux 发行版)上使用 Qt 5.13.1 可执行。
我必须将它安装在一个已经安装了旧 Qt 版本的平台上,我无法摆脱它。

所以我在自定义位置安装了所需 Qt 共享库(加上平台插件)的正确版本,并设置了 qt.conf将指定要使用的库路径的文件(插件路径也是如此)。

我自己的Qt安装文件夹包含:

  • lib/ 目录,其中包含要使用的库。
  • plugins/ 目录,其中包含 platforms/ 插件文件夹。

qt.conf 文件与我的可执行文件一起安装,内容如下:

[Paths]
Prefix = relative_path/from/executable_location/to/install_dir/

我不需要在条目中指定 lib/plugins/ 目录 LibrariesPlugins 因为它们默认为这些值。
但即使我明确设置它们,也没有任何改变。

我也尝试过使用绝对路径,但它也没有任何改变。

问题:我遇到的问题是我的可执行文件没有加载库,也没有找到平台插件,尽管 qt.conf 文件已成功加载。

我已经显示了以下指令的输出:

QLibraryInfo::location(QLibraryInfo::PrefixPath);
QLibraryInfo::location(QLibraryInfo::LibrariesPath);
QLibraryInfo::location(QLibraryInfo::PluginsPath);

它们包含我在 qt.conf 文件中指定的内容。所以问题不是出自这里。

问题:我已经检查过 QLibraryInfo 字段成员已正确初始化,但似乎我的 QApplication 实例只是忽略了它。
如何使 QLibraryInfo 配置被 QApplication 实例应用?

我知道存在一个 QCoreApplication::addLibraryPath()成员比可用于加载库但我也找不到 Qt 插件的任何类似内容。
但我很确定我们不必使用此函数,因为信息已由 QLibraryInfo 加载。


编辑:

经过更多调查,我发现它可以很好地加载插件。
加载库的问题仍然相同。似乎我错过了什么,但我想不通。
现在,我使用 LD_PRELOAD 环境变量来让它工作(这很丑陋)。


编辑 2:

我在互联网上发现了两个关于有同样问题的人的帖子:

第二个解释了为什么库加载不起作用。

实际上,为了能够解析 qt.conf 文件,应用程序需要加载核心模块(在我的例子中是 libQt5Core.so.5 ) 这是有道理的(我早该想到的)。

这里的问题是 libQt5Core.so.5 是要加载的库之一(这是一个恶性循环),因此可执行文件根本无法运行。

解决方案(仍然不加载任何库): 看来我无法避免使用 LD_PRELOAD 加载 libQt5Core.so.5 > 或将其添加到可执行位置旁边。

注意:如果系统“lib”目录中没有现有的 Qt 安装,我们可以使用 LD_LIBRARY_PATH 而不是 LD_PRELOAD。< br/>我在这里使用 LD_PRELOAD 因为我希望我的 Qt 安装优先于已经存在的安装(并且首先加载/而不是系统安装的)。

最佳答案

您的库的问题在于 Linux 动态链接器仅搜索几个标准位置,以及 /etc/ld.so.conf 中配置的其他路径。一种解决方法是环境变量 LD_LIBRARY_PATH 与您的库的路径。另一个是嵌入在二进制文件中的 RPATH/RUNPATH 值。 CMake 默认使用 RPATH,您也可以在 Qmake 项目中使用 QMAKE_RPATH。您可以使用 RPATH 手动组装一个包含程序和库的目录,但我的建议是 create AppDir / AppImage使用 linuxdeployqt 的包这与使用官方 Qt 工具非常相似 windeployqtmacdeployqt .

关于c++ - 如何在 QApplication 中应用 QLibraryInfo 中加载的库和插件配置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58975383/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com