使用.lib编译然后使用.dll链接或在C ++中显式调用dll?

时间:2017-09-08 07:49:53

标签: c++ c dll

尝试编写一个VS2015 .dll项目来了解.lib和.dll,但是被显式使用和隐式使用dll搞糊涂了。

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

这是我的步骤:

  1. 创建一个win32应用程序项目,其中包含名为" example.c"的.c文件,其中包含" test.h"。我把我的" test.lib"进入该项目的同一目录。
  2. 编译项​​目并获得发布版本。
  3. put" test.dll"进入发布目录
  4. 双击.exe,一切都很好。
  5. 我的问题是我的一个大学说我的程序只是使用静态库而没有涉及动态库,我应该明确加载" test.dll"这让我很困惑,因为我认为.lib将不包含实际代码,它应该只在编译期间使用。

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

1 个答案:

答案 0 :(得分:5)

你的大学是错的。

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

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

静态库

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

导入库

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

动态加载

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