gpt4 book ai didi

c++ - Qt QCoreApplication addLibraryPath 使用

转载 作者:太空狗 更新时间:2023-10-29 21:19:09 29 4
gpt4 key购买 nike

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

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

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

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

最佳答案

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

  • 程序启动时已经需要基本库/Dll das(如 Qt5core.dll)。
  • “功能库”,例如 Qt 插件和第三方内容,可以稍后加载。

(至少对我而言)哪个 DLL 属于第 1 类或第 2 类并不明显。这导致了一个问题,即找出您可以移入子文件夹并通过 addLibraryPath 将您的应用程序指向它可能很麻烦().

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

  • 使用 windeploy 找出大部分依赖项(我的应用程序的可执行文件位于项目文件夹下的“bin”文件夹中)

    • c:\Qt\Qt5.3.2\5.3\mingw482_32\bin\windeployqt.exe ..\bin\myapp.exe --release --force --compiler-runtime -libdir ..\bin -目录 ..\bin\plugins
    • 这会将“sort 1”库放入应用程序文件夹
    • 并将“sort 2”库放入子文件夹 plugins
  • 此外,需要让安装程序在注册表中设置环境变量“QT_PLUGIN_PATH”,以便应用程序找到插件。我浪费了几个小时才发现在运行时使用 addLibraryPath() 设置这条路径是行不通的。 qt.conf 文件似乎也不起作用。对我来说,唯一的选择是在 .bat 文件中设置环境变量,这与注册表设置基本相同。这是注册表项(在 inno setup 语法中):

    根:HKLM;子项:“SYSTEM\CurrentControlSet\Control\Session Manager\Environment”;值类型:字符串;值名称:“QT_PLUGIN_PATH”;值数据:“库”

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

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

Dependency Walker 总是被认为是解决这个问题的解决方案。对我来说也没有用。并未列出所有提到的库,但应用程序不会在没有库的情况下运行。也许是因为库只是在特殊情况下加载的?

关于c++ - Qt QCoreApplication addLibraryPath 使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28298507/

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