程序静态链接到库,但仍需要 dll 才能运行

Program statically linked to a library but still needs dll to run

本文关键字:dll 运行 链接 静态 程序      更新时间:2023-10-16
在链接方面,

有些事情我不明白......我正在使用第三方库(GEOS 库)编写程序。该程序依赖于geos.lib,但仍需要geos.dll才能运行。

读了这个问题,我想我明白静态库和动态库之间的区别。我不明白的是,为什么当我静态链接库时,我仍然需要一个dll。

Windows 上有 3 种库:

  • 对象库 (*.lib)
  • 导入库 (*.lib)
  • 动态库 (*.dll)

对象库是静态链接的。它们包含库抽象的代码的完整对象定义。

导入库是对象库的一种特殊形式。它们不包含代码,而是包含链接器的信息,链接器最终将可执行文件映射到动态链接库。

动态链接库(如对象库)为程序提供代码。但是,此代码在运行时加载,不会编译到您的 exe 中。

您并不总是需要链接导入库。相反,您可以调用 LoadLibrary() 并按名称或序号查找 API 入口点。(您始终必须告诉代码要输入哪个 DLL 以及您要在该 DLL 的 API 中的位置。

此处的其他注释是正确的,因为如果不重新编译库的代码,就无法将 DLL 转换为静态库 - 这是一种不同类型的输出。

它不是静态链接的。 .lib只是一个存根库,它绑定在窗口的.dll中。 也就是说,您在编译时与 .lib 链接,然后在运行时它将查找.dll。

如果 .lib 是由 Visual Studio 创建的,请检查项目属性 -> 链接器 -> 输入 -> 模块定义文件的值。如果它不为空,则链接.exe创建存根库而不是静态库,即使项目属性 -> 常规 -> 配置类型为"静态库 (.lib)"。

您肯定链接到一个动态库。仅仅因为链接器需要 .lib 文件并不意味着您要链接到静态库。

且仅当这是静态库文件时,您才能静态链接 lib 文件。因此,首先您需要将dll的项目转换为静态库,构建它,然后使用构建的产品,它将是一个静态.lib文件。