QMake使用时是否可能出现延迟加载DLL?

6
在我的项目中,我有一组DLL需要延迟加载,即在第一次使用时而不是在进程启动时加载。这意味着我想为某些DLL(而不是Qt本身)使用MSVC链接器的/DELAYLOAD标志(有关更多解释,请参见[1])。原因是一些用户在DLL初始化期间遇到崩溃问题(我们无法重现)。以前的非Qt版本软件没有这个问题,但它使用了延迟加载,所以可能会有所不同。
使用QMake,我找不到让延迟加载起作用的方法。是否有人知道如何通过绕过QMake来将/DELAYLOAD传递给msvc链接器的方法?
[1] http://www.codeproject.com/KB/DLL/Delay_Loading_Dll.aspx
2个回答

4

修改 .pro 文件:

## Make delayed load possible. If your project is itself a DLL which uses xxx.dll, you
## also need to include this line in the applications that use your DLL.
LIBS += DelayImp.lib

## Specify that xxx.dll loading needs to be delayed
win32:CONFIG(release, debug|release) {
    QMAKE_LFLAGS_RELEASE += /DELAYLOAD:xxx.dll
} else:win32:CONFIG(debug, debug|release) {
    QMAKE_LFLAGS_DEBUG += /DELAYLOAD:xxx.dll
}

我使用的是Qt5.1.1和MSVC 2012,但根据微软的说法,这应该从VC2005及以上版本都可以使用。


2

您应该能够将它添加到 QMAKE_LFLAGS 变量之一,例如 QMAKE_LFLAGS_RELEASE。这将在负责将您的 dll 链接到应用程序的项目文件中完成(可能是创建最终应用程序的文件)。

像这样:

win32 {
    QMAKE_LFLAGS_RELEASE+=/DELAYLOAD:MyDll.dll
}

应该可以工作。


下次我在那个项目上工作时,可能会尝试一下。我尝试了各种标志,但我还尝试了“注入”我想要延迟加载的DLL的名称,如果我没记错的话。实际上,我只想以这种方式加载特定的DLL,但将其应用于所有DLL可能并不会有害。 - Frank Osterfeld
@Frank:我已经更新了答案,添加了缺失的dll名称。从MSDN文档中看,似乎这个名称是必需的,所以你需要为每一个单独地进行操作。 - Troubadour
我想我尝试过了。好吧,我再试一次(客户项目,我不持续参与)。 - Frank Osterfeld

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接