- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我一直在使用 Windows 上的 QCoreApplication::addLibraryPath(QString &Path) 方法时遇到问题。
我试图用它来添加目录,应用程序应该在其中查找我正在使用 QLibrary 动态加载的 dll。
我很快意识到这不是正确的方法。我现在使用 putenv 方法直接更改我的环境变量。
另外,我仍然不明白 addLibraryPath 方法究竟应该用于什么?
最佳答案
关于这个主题,我认为 qt 文档不够清楚。有(至少)2 种库/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 -目录 ..\bin\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/
我一直在使用 Windows 上的 QCoreApplication::addLibraryPath(QString &Path) 方法时遇到问题。 我试图用它来添加目录,应用程序应该在其中查找我正在
我是一名优秀的程序员,十分优秀!