【问题标题】:DelayLoading a DLL and the associated .lib file延迟加载 DLL 和关联的 .lib 文件
【发布时间】:2010-10-14 18:45:05
【问题描述】:

我试图在我的应用程序中延迟加载 wintrust.dll 和 crypt32.dll(它们用于在 DLL 中执行数字签名/发布者检查)。我正在使用VS2008。在我的项目属性的链接器部分的延迟加载属性中添加这两个 DLL 作为条目后,我仍然收到 LNK4199 警告,指出未从 DLL 加载任何内容,并且 LNK2019 错误无法解析 WinVerifyTrust 等符号。

将以下内容作为条目添加到附加依赖项可缓解此问题:crypt32.lib 和 wintrust.lib。我现在对链接没有任何问题。但是,我想知道的是如何确保它没有链接到静态库?由于潜在的许可问题,我不想链接到静态库。我想动态加载安装在 Windows 中的 DLL,并希望 DelayLoad 可以帮助我做到这一点,而不必求助于 LoadLibrary 和 GetProcAddress 函数调用。

任何关于所有不同库使用/链接选项的信息将不胜感激!

谢谢。

【问题讨论】:

    标签: c++ dll linker static-libraries delay-load


    【解决方案1】:

    这些没有静态 .lib。 SDK 库始终是导入库,而不是静态 .lib,因为相应的 Windows API 位于 DLL 中。不用担心这个。

    【讨论】:

    • 酷,这正是我想知道的。你知道是否有任何文件可以证实这一点?
    • API 函数所在的 DLL 记录在他们的 MSDN 库页面中。您可以从stackoverflow.com/questions/3936468/…得到确认
    • 那是 Rick Roll 的 SO 版本。
    • @John:我必须查一下,是的。谢谢你的表情包。
    【解决方案2】:

    延迟加载不会让您不必链接到 lib 文件。通常,DLL 会在您的应用程序启动后立即加载。延迟加载只是将其延迟到您第一次从该 DLL 调用函数。无论哪种方式,您都需要链接到 lib 文件,以便链接器可以验证您正在调用的函数是否实际存在于 DLL 中。

    如果您不想链接到 lib 文件,您唯一的出路是使用 LoadLibraryGetProcAddress

    【讨论】:

      【解决方案3】:

      DependecyWalker 是一个可以帮助您确定是否按预期链接的工具:http://www.dependencywalker.com/ - 具体来说,在延迟加载的情况下,它会用特殊符号对其进行标记。

      【讨论】:

      • 酷,这表明它已链接到 Crypt32.dll 和 Wintrust.dll。
      【解决方案4】:

      您可能想查看 Win32 API 方法 LoadLibraryGetProcAddress

      【讨论】:

      • 我不关注...我已经提到我想这样做,而不必使用 LoadLibrary 和 GetProcAddress 通过使用 DelayLoad 来加载 DLL。
      • 这是我知道能够在运行时加载 DLL 而无需链接到定义符号的某些库的唯一方法。
      • 我想我更大的问题是,在执行此操作时,我似乎天生就静态链接到该库。不是这样吗?
      • DLL 的 .lib 文件实际上只指定了 DLL 中的地址和符号名称,因此链接器可以解析代码中的符号。
      • 实际上,Joshua 是正确的,静态导入 .lib 文件似乎只是地址和符号名称。但从 LGPL 的角度来看,尚不清楚使用静态导入库的隐式链接是否仍然符合“动态链接”的条件,或者 LoadLibrary 显式链接是否是在 Visual Studio 上与 LGPL 组件进行动态链接的唯一合法方式,而无需必须释放所有目标文件。 LGPL 似乎是在考虑 GCC 的情况下编写的,GCC 可以直接链接到 .so 和 (MinGW) .dll 文件,而无需涉及 .lib 文件。
      猜你喜欢
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      • 2017-02-11
      • 1970-01-01
      • 2011-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多