QT 中是否可以延迟 DLL 加载?例如,我的程序依赖于某些第三方 DLL,我想删除它。
我应该在 .pro 文件中写什么来消除依赖关系?
我可以将 DLL 存储在资源中吗?
我可以“全局”加载 DLL 吗?因此,DLL 中的某些函数(例如 func1)将在我的代码中保留为 func1。
QT 中是否可以延迟 DLL 加载?例如,我的程序依赖于某些第三方 DLL,我想删除它。
我应该在 .pro 文件中写什么来消除依赖关系?
我可以将 DLL 存储在资源中吗?
我可以“全局”加载 DLL 吗?因此,DLL 中的某些函数(例如 func1)将在我的代码中保留为 func1。
是的,你想使用这个QLibrary
类。它专门用于在运行时加载共享库。
在这种情况下,您的 .pro 文件中不需要任何内容。但是,您需要确保 DLL 在目标计算机上可用。它需要位于系统可以找到它的位置(Windows 上的 PATH,Linux 上的 LD_LIBRARY_PATH,Mac 上的 DYLD_LIBRARY_PATH),或者您可以提供应用程序的绝对路径。
如果您查看文档,您将了解如何将库函数映射到代码中的函数指针,以便“func1()”指向库中的函数。
[编辑]
这是从资源生成的临时文件加载 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
主文件
#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 文档。