【问题标题】:Why do I get a missing dll error after linking with a .lib?为什么在与 .lib 链接后会出现缺少 dll 的错误?
【发布时间】:2012-04-04 10:10:17
【问题描述】:

我从 1999 年开始就在开发这个 Windows 程序。我无法在 Visual Studio 中构建它,因为它一直给我关于缺少符号的链接器错误。然后我的同事告诉我尝试从原始项目中获取 .lib 文件并尝试将它们指定为附加链接依赖项。我做到了,程序链接得很好。当我尝试运行它时,它抱怨缺少 dll 文件。所以我找到了在一些旧计算机上运行的 Windows 程序的现有副本,复制了 dll 文件,我的构建开始工作了!这是我一生中最快乐的一天,但我不太清楚发生了什么。

谁能简要解释一下什么是 Windows 中的 lib 文件以及它们与 dll 的关系?

【问题讨论】:

标签: windows dll linker


【解决方案1】:

.LIB 文件在 Windows 上有两种用途。 Ken 提到了其中一个,它用于静态链接,但还有另一种用途,称为import library,这就是您在这里所拥有的。如果您自己构建一个 .DLL,您可以选择为其生成一个导入库。这样做的效果是,您可以只链接 .LIB 文件,就像链接常规静态库一样,但 .LIB 实际上只包含用于从 DLL 加载入口点的样板代码。

这很有用的原因是您可能需要将代码作为 dll 分发(例如,这样您就可以独立于主应用程序对其进行更新,或者将 dll 作为插件提供),但它可以更轻松地链接到应用程序,因为.LIB 处理 LoadLibrary()GetProcAddress() 调用,因此您不必这样做。它还可以从 dll 加载类定义,这是您无法使用 GetProcAddress() 自己完成的。

更多信息MSDN

【讨论】:

  • 好收获。自从我使用普通的旧 C/C++ 工作以来已经很长时间了,以至于我忘记了这个(而且它是正确的)。您应该编辑您的答案以包含其他用途(我提到的那个),我将删除我的答案。 :)
  • 我正在尝试链接到 freeglut_static.lib,但我仍然缺少 dll,freeglut.dll。我究竟应该在 Visual Studio 中做什么来链接到非导入 lib 文件?我已将/MT 选项和附加依赖项设置为freeglut_static.lib 而不是freeglut.lib
【解决方案2】:

.LIB(库)文件是已编译源文件(目标文件)的集合,您可以将其链接到应用程序以提供功能。链接使使用的目标文件成为可执行文件本身的一部分。这通常称为static linking,这就是为什么您会收到有关缺少符号的编译时错误;库文件无法从中提取所需的目标代码以将其添加到您的应用程序中。

.DLL(动态链接库)文件是编译后的源文件,您可以在运行时加载并使用特定功能(通常按名称);它们不是可执行文件的一部分,而是在运行时从 DLL 本身加载的。 (正如您已经体验过的那样,没有可用的 DLL 意味着您的应用无法运行。)编译时不需要它们,而仅在运行时需要它们。

一些 IDE(例如 Visual Studio C/C++)同时提供静态 .LIB 文件和 .DLL 版本,因此您可以选择将运行时库直接链接到您的应用程序或让它们可用于在运行时动态加载。 (第二个很有用,例如,如果您已经开发了多个应用程序;您可以使用 MSVCRTL 的动态版本通过单独分发 RTL 而不是链接到每个应用程序来大幅减少可执行文件的大小。

【讨论】:

  • 有趣的是我需要.LIB.DLL 来运行我的应用程序!没有.LIB,我无法编译,没有.DLL,我无法运行它。
  • 他们可能无关。但很难说,因为您没有提供关于 which 库和 DLL 的信息。 :)
猜你喜欢
  • 1970-01-01
  • 2020-09-10
  • 2011-11-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
相关资源
最近更新 更多