使用.lib进行编译,然后使用.dll链接或显式调用C++中的dll?

问题描述:

尝试编写VS2015 .dll项目以了解.lib和.dll,但被显式使用和隐式使用dll混淆。使用.lib进行编译,然后使用.dll链接或显式调用C++中的dll?

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

这里是我的步骤:

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

我的问题是我的大学之一说我的程序只是使用静态库,并没有涉及动态库,我应该明确加载“test.dll”,这让我很困惑,因为我认为.lib将不包含实际的代码,它应该只在编译期间使用。

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

+0

'.lib'文件可以是两种。 –

你的大学是错的。

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

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

静态库

如果它是一个静态库,所有的代码包含在的.lib文件,当你链接到的.lib文件的代码嵌入在你的可执行文件。没有使用dll文件/需要。

导入库

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

动态加载

第三个选择是明确有你的代码加载.dll文件,并提取/施放的所有功能的/ etc。从dll使用其名称的字符串表示形式。使用此方法,您不会在构建时链接到任何.lib文件 - 如果您要加载插件或dll,此方法非常有用,但如果这些dll不存在,仍然可以执行可执行文件。这可能是你大学正在讨论的内容,你可能不需要这样做。

+0

非常感谢!我想他可能会误解我的.lib文件为静态库。 – disccip

+0

如果它帮助你,也许你可以接受答案 –