23

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

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

4

5 回答 5

32

Windows 上有 3 种库:

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

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

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

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

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

这里的其他评论是正确的,因为如果不重新编译库的代码,就无法将 DLL 制作成静态库——它是一种不同的输出。

于 2012-06-15T14:19:21.557 回答
24

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

于 2012-06-15T13:25:11.260 回答
2

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

于 2014-05-08T16:08:07.313 回答
0

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

于 2012-06-15T13:29:03.367 回答
0

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

于 2012-06-15T13:26:22.680 回答