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

问题描述 投票:1回答:1

Context:我已经在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/
我不需要在条目LibrariesPlugins中指定

lib /

]和plugins /目录,因为它们默认为这些值。但是,即使我明确设置它们,它也不会改变。我也尝试了绝对路径,但它也没有改变。

问题:

我遇到的问题是,尽管qt.conf文件已成功加载,但我的可执行文件未加载库,都没有找到平台插件我已经显示了以下指令的输出:

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

它们包含我在

qt.conf

文件中指定的内容。因此,问题并非来自这里。

问题:

我检查了QLibraryInfo字段成员是否已正确初始化,但看来我的QApplication实例只是忽略了它。如何使QLibraryInfo实例应用QApplication配置?[我知道存在一个QCoreApplication::addLibraryPath()成员,该成员可以用来加载库,但是我也找不到Qt插件的相似之处。但是我很确定我们不必使用此功能,因为QCoreApplication::addLibraryPath()已经加载了信息。


编辑:

经过更多调查后,我发现它可以很好地加载插件。对于加载库,问题仍然相同。似乎我错过了一些东西,但我无法弄清楚。现在,我使用QLibraryInfo环境变量以使其起作用(这很丑陋)。


编辑2:

[我在互联网上发现了两个有关相同问题的人的话题:

文件,应用程序需要加载Core模块(在我的情况下为libQt5Core.so.5),这很有意义(我应该想到了)。
这里的问题是libQt5Core.so.5是要加载的库之一(这是一个恶性循环),因此可执行文件根本无法运行。

Solution

(仍然不加载任何库):看来我无法避免使用https://www.qtcentre.org/threads/32236-qt-conf-(again)-on-windows加载libQt5Core.so.5或将其添加到可执行位置旁边。

注意:如果系统“ lib”目录中尚未存在Qt安装,则可以使用LD_PRELOAD代替LD_LIBRARY_PATH。我在这里使用LD_PRELOAD是因为我希望我的Qt安装优先于已经存在的Qt安装(并首先加载/而不是系统安装的安装)。

上下文:我已经在OpenSUSE平台(某些Linux发行版)上使用Qt 5.13.1构建了c ++可执行文件。我必须将其安装在已经安装了旧Qt版本的平台上,但我无法...
c++ linux qt shared-libraries
1个回答
0
投票
您的库的问题是Linux动态链接器仅搜索几个标准位置以及LD_PRELOAD中配置的其他路径。一种解决方法是使用环境变量LD_LIBRARY_PATH和库的路径。另一个是二进制文件中嵌入的RPATH / RUNPATH值。 CMake默认使用RPATH,您也可以在Qmake项目中使用QMAKE_RPATH。您可以手工组装一个包含使用RPATH相关程序和库的目录,但我的建议是使用/etc/ld.so.conf来封装create AppDir / AppImage软件包,这与使用官方Qt工具linuxdeployqtwindeployqt非常相似。
© www.soinside.com 2019 - 2024. All rights reserved.