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

dis*_*cip 2 c c++ dll

尝试编写一个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不会包含实际的代码,它应该只在编译期间使用.

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

nos*_*nos 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不存在,仍然可以使用您的可执行文件.这可能是你的大学所说的,你可能不需要这样做.