我在Windows上遇到了QCoreApplication :: addLibraryPath(QString& Path)方法的麻烦。
我试图用它来添加应用程序应该寻找dll的目录,我正在用QLibrary动态加载。
我很快意识到这不是正确的方法。我现在使用putenv方法直接改变我的环境变量。
另外,我仍然不明白addLibraryPath方法到底应该用于什么?
答案 0 :(得分:3)
我认为qt文档对于这个主题还不够清楚。 有(至少)2种libs / dll:
对于哪种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
此外,需要让安装程序设置环境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
的路径。