为什么visual studio与.DLL一起创建.LIB?

Raj*_*aja 11 c++ dynamic-linking visual-studio libconfig

我有一个项目"Logger",其中配置类型是.dll.

"Logger"使用"libconfig"(开源配置解析器).目前,我有一个单独的"libconfig"项目,其配置类型是.lib

我将"libconfig"添加到Logger的框架和引用设置:

  • link library depedencies = true
  • 使用库依赖输入= false

在Logger的链接器命令行中,我看到:/ IMPLIB:"path\to\Logger.lib"

我的问题是:为什么需要创建Logger.lib?我看到/ OUT ="path\to\Logger.dll",但我试图抓住visual studio的构建过程.

M $的IMPLIB文档中,我看到了LINK过程的一部分.我还是不明白.

编辑:我没有提到如何使用Logger DLL.我的应用程序将在运行时加载它(因为只有特定的cmd行args才需要此功能)

Jer*_*fin 13

DLL包含代码..lib文件基本上包含文件中函数的存根,这使得链接器可以轻松(并且相对快速)将正确的信息放入可执行文件以使用DLL中的函数.

最终,没有理由他们必须这样做 - 它主要使链接器更简单,更快,因为它不需要(至少同样多)特殊情况代码来处理静态库和动态库.他们可以通过将代码和链接信息放入单个文件来解决这个问题,但这会增加文件大小(一点点).

它现在可能并不多,但当Windows是新的时,很多程序仍然分布在360K软盘上,因此最小化分发给用户的文件大小被认为是相当重要的.


Sco*_*MVP 5

使用logger.dll的exe需要链接到logger.lib.如果没有lib,就无法构建exe.lib包含满足exe代码调用的存根函数.(在运行时,存根将调用传输到DLL中.)

  • 正确.如果在运行时获得函数指针,则不需要.lib.这就像在代码中自己进行链接而不是编译调用并让链接器执行它.您的问题是为什么创建了lib文件:它是创建的,因此exe文件可以解析对DLL函数的普通调用. (3认同)
  • 这不会取决于DLL的加载方式,即静态加载(头文件包含一堆导入)v/s动态加载和在运行时获取函数指针.我不明白为什么后者需要.lib来构建EXE. (2认同)