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

时间:2012-06-15 13:23:51

标签: c++ dll linkage

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

我读过this question,我想我理解静态库和动态库之间的区别。我不明白的是为什么我静态链接库时仍然需要一个dll。

5 个答案:

答案 0 :(得分:27)

Windows上有3种库:

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

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

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

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

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

这里的其他注释是正确的,因为如果不重新编译libary的代码就不能将DLL变成静态库 - 它是一种不同的输出。

答案 1 :(得分:21)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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