Qt QCoreApplication addLibraryPath使用

时间:2015-02-03 12:07:00

标签: c++ qt dynamic

我在Windows上遇到了QCoreApplication :: addLibraryPath(QString& Path)方法的麻烦。

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

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

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

2 个答案:

答案 0 :(得分:3)

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

  • 程序启动时已经需要Essential Libs / Dlls 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 -dir ..\bin\plugins
    • 这将"排序1" libs进入app文件夹
    • 和"排序2" libs进入子文件夹插件
  • 此外,需要让安装程序设置环境var" QT_PLUGIN_PATH"在注册表中让应用程序找到插件。我浪费了几个小时才发现在运行时使用addLibraryPath()设置这条路径是行不通的。另外一个qt.conf文件似乎不起作用。对我来说唯一的选择是在.bat文件中设置环境变量,这与注册表设置基本相同。 这是注册表项(在inno设置语法中):

    Root:HKLM;子键:" SYSTEM \ CurrentControlSet \ Control \ Session Manager \ Environment&#34 ;; ValueType:string; ValueName:" QT_PLUGIN_PATH&#34 ;; ValueData:" lib"

另一个令人讨厌的事情是,某些libs不是由windeploy识别的。这些主要是编译器可再发行组件,它们将随您使用的编译器而变化。其他更多取决于您使用的功能,并且windeploy不会以某种方式处理。这个事实没有明显的记录(至少我没有看到它),也不容易理解。对于我的应用程序,这些是以下编译器redists和一些与数据库相关的库:

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

1

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

答案 1 :(得分:0)

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

关于QCoreApplication::​libraryPaths()的Qt文档:

  

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

在Qt文档中也说明了:

  

应用程序有一个applicationDirPath()和一个   applicationFilePath()。可以检索库路径(请参阅QLibrary)   使用libraryPaths()并由setLibraryPaths()操作,   addLibraryPath()和removeLibraryPath()。

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