为什么visual studio需要一个静态库(.lib)来进行动态链接?

时间:2015-05-06 07:48:42

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

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

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

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

2 个答案:

答案 0 :(得分:2)

它是一个导入库,其中包含位于DLL内的导出定义以及DLL (*)的名称。

  

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

还有:

  

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

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

(*)我看到很多人试图更改.lib和相应的.dll的名称并预期会发生变化。 .lib的内容是它没有的原因。

答案 1 :(得分:1)

  • 告诉它DLL的名称及其中的内容,以及使用的条目pioint数字,以及

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