【问题标题】:Why visual studio needs a static library (.lib) for dynamic linking?为什么 Visual Studio 需要一个静态库 (.lib) 来进行动态链接?
【发布时间】:2015-07-16 05:28:44
【问题描述】:

我想在我的项目中使用一些 dll (VS2013 - c++),

我使用“project->properties->vc++ 目录”给出了dll和headers的路径,构建项目后,出现链接器错误(常见的“未解析的外部符号”)。将 .lib 文件提供给链接器即可解决问题!

但是为什么动态链接需要静态库(.lib)???

【问题讨论】:

  • 这就是动态链接在 Windows 上的工作方式。 Google 术语:“导入库”、“def 文件”、“__declspec(dllimport)”
  • 这里已经全面解答stackoverflow.com/questions/3573475/…

标签: c++ visual-studio-2013 linker static-linking dynamic-linking


【解决方案1】:

它是一个导入库,其中包含导出的定义,位于 DLLDLL 的名称中(*)

您可以使用LIB/DEF 选项来创建导入库和导出文件。 LINK 使用导出文件构建包含导出的程序(通常是动态链接库 (DLL)),并使用导入库解析对其他程序中这些导出的引用。

还有:

在大多数情况下,您不需要使用LIB 来创建您的导入库。当您链接包含导出的程序(可执行文件或DLL)时,LINK 会自动创建一个描述导出的导入库。稍后,当您链接引用这些导出的程序时,您指定导入库。

动态库在运行时加载(在应用程序启动时) - 链接器不会检查某些特定符号在 DLL 中的位置。 Header__dllimport - “这个符号是外部符号,它应该从某个地方导入”。 Lib 说“我知道这个符号在哪里 - 它位于 XXX.dll 中,所以在启动后查看那里”。


(*) 我看到很多人都在尝试更改.lib 和对应的.dll 的名称,并期望它会起作用。 .lib 的内容是它没有的原因。

【讨论】:

  • 那么有没有办法在VS中使用没有对应lib文件的dll?? (Visual Studio 可以从 dll 本身中提取所有信息吗??就像 GNU Linker 一样??)
  • @payman 迟到总比不到好 - 是的,there is
【解决方案2】:
  • 告诉它 DLL 的名称和其中的内容,以及如果使用的入口点编号是什么,以及

  • 将二进制接口(.lib)与其实现(DLL)隔离开来。例如,Winsock 有一个标准的 .lib 文件,该文件独立于实际的多供应商实现,早在当年。

【讨论】:

  • 那么当我们只有 dll 文件时该怎么办呢?我认为有关库的所有信息(名称、导出、入口点……)都可以从 dll 本身中提取?!
  • 您可以从 DLL 创建 .lib 文件。
猜你喜欢
  • 1970-01-01
  • 2011-03-16
  • 1970-01-01
  • 1970-01-01
  • 2021-10-22
  • 2014-11-15
  • 1970-01-01
  • 2013-01-22
相关资源
最近更新 更多