Context:我已经在OpenSUSE平台(某些Linux发行版)上使用Qt 5.13.1构建了一个c++可执行文件。我必须将其安装在已经安装了旧Qt版本的平台上,但我无法摆脱它。
因此,我已在自定义位置安装了所需Qt共享库的正确版本(加上平台插件),并设置了一个qt.conf文件,该文件将指定要使用的库路径(与插件路径相同)。
我自己的Qt安装文件夹包含:
qt.conf
文件与我的可执行文件一起安装,并按以下方式填充:[Paths]
Prefix = relative_path/from/executable_location/to/install_dir/
我不需要在条目]和plugins /目录,因为它们默认为这些值。但是,即使我明确设置它们,它也不会改变。我也尝试了绝对路径,但它也没有改变。Libraries
和Plugins
中指定lib /
问题:
我遇到的问题是,尽管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:
[我在互联网上发现了两个有关相同问题的人的话题:LD_PRELOAD
实际上,
为了能够解析qt.conf
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安装(并首先加载/而不是系统安装的安装)。
LD_PRELOAD
中配置的其他路径。一种解决方法是使用环境变量LD_LIBRARY_PATH和库的路径。另一个是二进制文件中嵌入的RPATH / RUNPATH值。 CMake默认使用RPATH,您也可以在Qmake项目中使用QMAKE_RPATH。您可以手工组装一个包含使用RPATH相关程序和库的目录,但我的建议是使用/etc/ld.so.conf
来封装create AppDir / AppImage软件包,这与使用官方Qt工具linuxdeployqt和windeployqt非常相似。