【问题标题】:Use .lib to compile then use .dll to link or explicitly call dll in C++?使用 .lib 编译然后使用 .dll 在 C++ 中链接或显式调用 dll?
【发布时间】:2017-09-08 07:49:52
【问题描述】:

试图写一个 VS2015 .dll 项目来了解 .lib 和 .dll 但被显式使用和隐式使用 dll 弄糊涂了。

现在我创建了一个 .dll 项目并成功编译它,然后我得到了一个 test.lib 和 test.dll,所以我的 test.h 应该可以在另一个项目中使用来验证功能对吗?

这是我的步骤:

  1. 创建一个包含名为“example.c”的.c 文件的win32 应用程序项目,其中包括“test.h”。我把我的“test.lib”放到这个项目的同一个目录中。
  2. 编译项目并获得发布版本。
  3. 将“test.dll”放入发布目录
  4. 双击.exe,一切正常。

我的问题是我的一所大学说我的程序只是使用静态库而不涉及动态库,我应该显式加载“test.dll”,这让我很困惑,因为我认为 .lib 不会包含实际代码,它应该只在编译时使用。

如果我错了,请纠正我。谢谢!

【问题讨论】:

  • .lib文件可以有两种。

标签: c++ c dll


【解决方案1】:

你的大学错了。

您的库项目已经创建了一个导入库(.lib)和 dll,当您链接到您的 .lib 时,它只是一个指向 dll 文件的存根。如果您从 .exe 文件所在的位置删除 .dll 文件,则 .exe 文件不应启动,因此这是验证您是否需要 .dll 的一种方法。

Windows 中的 .lib 文件可以是静态库或导入库。

静态库

如果它是静态库,则所有代码都包含在 .lib 文件中,当您链接到该 .lib 文件时,代码将嵌入到您的可执行文件中。没有使用/不需要 dll 文件。

导入库

如果.lib 文件是一个导入库,它只包含一个指向.dll 的存根,当您链接到这个时,您的可执行文件不会嵌入库的代码,而是链接到.dll。可执行文件需要 .dll 存在,并会在 exe 启动时尝试自动加载。

动态加载

第三个选项是让您的代码显式加载 .dll,并提取/转换所有函数/等。从 dll 使用其名称的字符串表示形式。使用此方法,您不会在构建期间链接到任何 .lib 文件 - 如果您想加载插件或 dll,此方法很有用,但如果这些 dll 不存在,您仍然可以执行可执行工作。这很可能是您的大学正在谈论的内容,您可能不需要这样做。

【讨论】:

  • 非常感谢!我认为他可能将我的 .lib 文件误解为静态库。
  • 如果对你有帮助,也许你可以接受答案
猜你喜欢
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-01
  • 1970-01-01
  • 2023-04-05
相关资源
最近更新 更多