【问题标题】:Why does visual studio create a .LIB along with the .DLL?为什么 Visual Studio 会随 .DLL 创建一个 .LIB?
【发布时间】:2013-09-27 01:46:25
【问题描述】:

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

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

我在 Logger 的框架和引用设置中添加了“libconfig”:

  • 链接库依赖 = true
  • 使用库依赖输入 = false

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

我的问题是: 为什么需要创建 Logger.lib?我懂了 /OUT = "path\to\Logger.dll",但我正在尝试了解 Visual Studio 的构建过程。

M$'s IMPLIB doc,我看到它是 LINK 过程的一部分。我还是不明白。

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

【问题讨论】:

    标签: c++ visual-studio dynamic-linking libconfig


    【解决方案1】:

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

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

    现在可能意义不大,但在 Windows 刚推出时,仍有不少程序在 360K 软盘上分发,因此将分发给用户的文件大小最小化被认为是相当重要的。

    【讨论】:

    • 我明白了。因此,在创建可执行文件时,.lib 与其他所有内容都链接在一起,但这个 .lib 实际上只是一组函数,它们 1:1 挂钩到 DLL 的导出函数。对吗?
    • 这不取决于加载时与运行时的动态链接吗?对于加载时链接,您所说的对我来说完全有意义。我的错误 - 我没有提到在问题中将如何使用 Logger DLL。应用程序将在运行时加载/卸载它
    • @Raja:是的——如果您在运行时使用LoadLibraryGetProcAddress 链接,则不会使用.lib 文件(而且通常根本不会出现)。
    • @Raja:我不知道告诉 VS 不要创建它的简单方法。它通常还会创建一个您通常也不需要的.exp 文件(除非您有循环依赖项)。我想如果你真的想让它们消失,你可以添加一个后期构建步骤来删除它们,但我从来没有打扰过。
    • 感谢您花时间澄清一切,杰瑞。欣赏!
    【解决方案2】:

    使用您的 logger.dll 的 exe 将需要链接到 logger.lib。没有lib,无法构建exe。该库包含满足 exe 代码调用的存根函数。 (在运行时,存根将调用转移到 DLL 中。)

    【讨论】:

    • 这不取决于加载 DLL 的方式,即静态加载(头文件包含一堆导入)v/s 动态加载并在运行时获取函数指针。我不明白为什么后者需要 .lib 来构建 EXE。
    • 正确。如果您在运行时获得函数指针,则不需要 .lib。这就像在代码中链接自己而不是编译调用并让链接器来做。您的问题是为什么要创建 lib 文件:创建它是为了让 exe 文件可以解析对 DLL 函数的普通调用。
    猜你喜欢
    • 2021-12-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 1970-01-01
    • 1970-01-01
    • 2011-02-18
    相关资源
    最近更新 更多