我正在尝试将一些旧的 MSVC C++ 代码移植到 MinGW/GCC。
一个问题是该项目严重依赖 /DELAYLOAD 选项来执行并不总是使用的函数,以及运行时正确的 dll 所在的位置。
MinGW/GCC 上有类似的选项吗?
此代码针对Windows平台。
我想补充一点,虽然延迟加载 DLL 看起来是 Windows 操作系统的一部分,但它们实际上是通过链接器生成的小存根来实现的。至少,过去是这样。因此,Windows 操作系统级别没有“延迟加载”的正式概念。有一个约定,基于链接器发出的二进制代码。
在 elf 目标上(对于类 Unix 系统),您可以使用
-z lazy
(MinGW 也使用的链接器)指定 ld
选项(无论如何这是默认值)。
据我所知,i386 PE 目标(适用于 Windows)没有有显式的延迟链接选项。我找不到任何可用的文档。
您可以使用
--output-delaylib
的 dlltool
参数来创建延迟加载的导入库。然后,您可以链接生成的导入库以延迟加载 DLL。
作为延迟加载现有 DLL 的示例,假设您想要延迟加载 Windows DLL
version.dll
,它导出 GetFileVersionInfoSizeW
。首先,我们在 version.def
文件中定义要调用的函数:
EXPORTS
GetFileVersionInfoSizeW
然后我们可以使用
dlltool
创建延迟加载的导入库:
dlltool --input-def version.def --output-delaylib version.lib --dllname version.dll
链接时,使用生成的结果
version.lib
:
gcc -o test test.c -lversion -L .
此示例的完整版本可在 我的 GitHub 上找到。
有趣的事实:在提出这个问题时,已发布的软件可能不提供此功能。该功能是在提出这个问题之前三个月提交的。