Qt QCoreApplication addLibraryPath use

Qt QCoreApplication addLibraryPath use

本文关键字:use addLibraryPath QCoreApplication Qt      更新时间:2023-10-16

我一直在使用Windows上的QCoreApplication::addLibraryPath(QString &Path)方法时遇到问题。

尝试使用它来添加目录,应用程序应该在其中查找我正在使用 QLibrary 动态加载的 dll。

我很快意识到这不是正确的方式。我现在使用 putenv 方法直接更改我的环境变量。

另外,我仍然不明白addLibraryPath方法到底应该用于什么?

我认为qt文档在这个主题上还不够清楚。(至少)有 2 种库/dll:

  • 在程序启动时已经需要基本的 Libs/dlls das(如 Qt5core.dll)。
  • "功能库",如Qt插件和第三方的东西,可以稍后加载。
至少

对我来说)哪个 DLL 是类型 1 或类型 2 并不明显。这导致了一个问题,即找出哪些可以移动到子文件夹中并通过addLibraryPath()将应用程序指向它可能会很讨厌。

对我来说,以下解决方案有效:

  • 使用 Windeploy 找出依赖项的较大部分(我的应用的可执行文件位于项目文件夹下方的"bin"文件夹中)

    • c:QtQt5.3.25.3mingw482_32binwindeployqt.exe ..binmyapp.exe --release --force --compiler-runtime -libdir ..bin -dir ..binplugins
    • 这会将"排序 1"库放入应用程序文件夹
    • 并将"排序 2"库放入子文件夹插件中
  • 此外,还需要让安装程序在注册表中设置环境变量"QT_PLUGIN_PATH",以便应用找到插件。我浪费了几个小时只是为了发现在运行时使用 addLibraryPath() 设置此路径是行不通的。此外,qt.conf文件似乎不起作用。对我来说,唯一的选择是在.bat文件中设置环境变量,这与注册表设置基本相同。下面是注册表项(采用 inno 安装程序语法):

    根:HKLM;子项:"系统\当前控制集\控制\会话管理器\环境";值类型:字符串;值名称:"QT_PLUGIN_PATH";ValueData: "lib"

另一个令人厌恶的事情是,某些库没有被windeploy识别。这些主要是编译器可再发行组件,它们会因您使用的编译器而异。其他功能则更多地取决于您使用的功能,并且不知何故不由 windeploy 处理。这个事实显然没有记录下来(至少我没有看到),也不容易理解。对于我的应用程序,这些是以下编译器编辑者和一些与数据库相关的库:

libeay32.dll
libgcc_s_dw2-1.dll
libintl.dll
libpq.dll
libstdc++-6.dll
libwinpthread-1.dl

l

依赖沃克总是被认为是找出这个问题的解决方案。对我来说,这也行不通。并非所有提到的库都已列出,但该应用程序不会在没有库的情况下运行。也许是因为库只是在特殊情况下加载的?

addLibraryPath为应用程序在动态加载库时将搜索的路径添加一个路径。

来自Qt文档中关于QCoreApplication::​libraryPaths()

此列表将包括插件的安装目录,如果 存在(插件的默认安装目录是 INSTALL/plugins,其中 INSTALL 是 Qt 所在的目录 已安装)。应用程序可执行文件的目录(不是 工作目录)始终添加,以及冒号分隔 QT_PLUGIN_PATH环境变量的条目。

Qt文档中也指出:

应用程序具有 applicationDirPath() 和 applicationFilePath()。可以检索库路径(参见 QLibrary) with libraryPaths() 并由 setLibraryPaths() 操作, addLibraryPath() 和 removeLibraryPath()。

因此,您似乎可以使用addLibraryPath添加QLibrary路径。