QT 中的 DLL 加载延迟
Delayed DLL load in QT
QT中可以延迟DLL加载吗?例如,我的程序依赖于某些第三方 DLL,我想删除它。
我应该在 .pro 文件中写什么来删除依赖项?
是否可以将 DLL 存储在资源中?
我可以"全局"加载 DLL 吗?因此,DLL 中的某些函数(例如 func1)在我的代码中将保持 func1。
是的,你想使用 QLibrary
类。它专门用于在运行时加载共享库。
在这种情况下,您的 .pro 文件中不需要任何内容。但是,您需要确保 DLL 在目标计算机上可用。它要么需要位于系统可以找到它的位置(Windows 上的 PATH,Linux 上的 LD_LIBRARY_PATH,Mac 上的DYLD_LIBRARY_PATH),或者您可以从应用程序中提供绝对路径。
如果您查看文档,您将看到如何将库函数映射到代码中的函数指针,以便"func1()"指向库中的函数。
- QLibrary 类参考
[编辑]
下面是从资源生成的临时文件加载 dll 的概念证明。IMO,这是一个非常糟糕的主意,但它至少适用于我的Windows 7机器。如果你想做类似的事情,你将不得不处理清理临时文件,检查重复项等。
foo.cpp,编译成共享库
#include <QtCore/qglobal.h>
extern "C" Q_DECL_EXPORT int foo(int value) {
return value + 42;
}
bar.pro,请注意没有引用 foo 库
SOURCES += main.cpp
RESOURCES += resources.qrc
主.cpp
#include <QtCore>
#include <iostream>
int main(int argc, char **argv) {
QCoreApplication app(argc, argv);
// Copy resource dll to temporary file.
QFile::copy(":/lib/Foo.dll", QDir::temp().filePath("Foo.dll"));
// Load the temporary file as a shared library.
QLibrary foo_lib(QDir::temp().filePath("Foo.dll"));
typedef int (*FooDelegate)(int);
FooDelegate foo = (FooDelegate)foo_lib.resolve("foo");
if (foo) {
std::cout << "foo(13) = " << foo(13) << std::endl;
}
}
我只能从Microsoft编译器的角度来看... 它与其说取决于QT想要什么,不如说取决于访问延迟加载代码和/或数据的时间和地点。
通常,您必须告诉链接器DLL是使用/delayload:[dllname]
选项延迟加载的,并使用delayimp.lib链接。 您可以使用以下命令在.cpp文件中添加库
#pragma comment(lib, "delayimp")
这将消除在链接器命令行上指定它的需要。
我不确定 .pro 文件中的内容可以完成将延迟加载开关添加到链接器命令。
有关Microsoft文档,请参阅此链接。
- 为什么有些延迟加载 DLL 会立即使用 FFMPEG 卸载?
- 指向临时对象的自定义迭代器(延迟加载)
- 延迟加载加密++密码.dll
- C++插件不能延迟加载dll时
- 延迟加载的 DLL 在内存中彼此相距太远
- 延迟加载opengl32.dll失败,出现Qt5
- 使用延迟加载加载正确的库 - 返回值类型错误
- 延迟加载可以被视为RAII的一个例子吗
- 延迟加载DLL
- 延迟加载DLL时的函数原型
- Xcode 将 dylib 复制到具有延迟加载功能的捆绑包中
- 设计延迟加载
- 在窗口中延迟加载
- 如何在遵守得墨忒耳定律的同时延迟加载
- 提升::几何 R*树和分页/延迟加载
- 延迟加载的 DLL - 我缺少什么
- 如何在Linux中使懒惰/延迟加载工作
- 在Windows XP和CodeBlocks上延迟加载DWMAPI
- c++ unordered_map,有效的延迟加载和value的使用
- 是否有任何链接器标志告诉在打开后延迟加载动态库