Qt QCoreApplication addLibraryPath use
Qt QCoreApplication addLibraryPath use
我一直在使用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
路径。
- 如何处理 c++ 中类实现中的"invalid use of non-static data member"?
- C++ "error: invalid use of void expression"
- 我看到"use of undeclared identifier"错误,有人可以告诉我如何解决它吗?
- 收到错误"invalid use of non-static data member 'stu::n' "
- 模式"allocate memory or use existing data"
- C++ "error: use of overloaded operator '*' is ambiguous"似乎只有一场比赛
- Is it good to use SDL_PIXELFORMAT_UNKNOWN?
- C++ "Invalid use of 'this' in non-member function" ,
- std::launder use cases in C++20
- 继承类时"invalid use of incomplete type ‘class tree_node_t’"
- "reserved for any use"的含义是什么?
- C++14 遇到奇怪的"use of deleted function"错误
- C++ 中的 use 函数是什么?
- 出现这种错误的原因是什么"invalid use of non-static data member "
- 模板类和'invalid use of incomplete type'错误
- 为什么"non-standard syntax; use '&' to create a pointer to member"在 CTOR 中使用线程?
- "invalid use of incomplete type" .解决循环依赖关系
- 使用互斥锁和条件变量作为成员时如何修复"use of deleted function"?
- 如何在 LLVM 后端的机器级别找到 def-use 链
- Qt QCoreApplication addLibraryPath use