如何在visual studio中链接dll?

时间:2016-06-16 13:24:09

标签: c++ visual-studio dll dynamic-linking

要链接静态库,我必须从.h和.c文件创建.lib。 然后我将它添加到我的项目中,放入Additional Dependencies并编译。

要使用dll,我需要.dll和.lib。这个.lib与上面相同或不同? 怎么说Visual Studio使用.dll和.lin,不仅仅是.lib? 我将.dll放到项目目录中并且没有任何改变(.exe具有相同的大小(我认为应该更少)。)

2 个答案:

答案 0 :(得分:3)

编译DLL项目时,您将获得DLL和LIB文件作为输出。 DLL包含实际的库代码; LIB文件包含导出函数的存根,这些存根函数可帮助链接器发出代码来调用该DLL。

这与编译静态库时获得的LIB文件非常不同。 LIB文件包含构成库的所有目标代码。所有这些代码在构建时都会直接链接到您的可执行文件中 - 因此"静态"名称的一部分。

但是,实际使用方式非常相似。无论您是链接到动态库还是静态库,都可以将链接器(使用"附加依赖项")指向LIB文件。连接器完成剩下的工作;它可以从LIB文件中告诉它应该做什么。

当然,您必须确保它是正确的LIB文件。将两个项目(DLL和EXE)放在同一个解决方案中将允许您使用项目引用,使任务基本上万无一失。

编辑:除非DLL导出函数,否则在构建DLL时当然不会获得LIB文件。 (如果它没有导出任何函数,那么该DLL的客户端就无法调用,所以没有理由使用LIB文件!)安排函数的最简单方法是从DLL导出是使用__declspec(dllexport)注释。如果与宏结合使用,您可以安排它在消费者端解析为__declspec(dllimport),允许您使用相同的头文件来构建DLL并从应用程序中使用它。在我的回答here中有关于此的更多信息。或者,您可以使用a DEF file with an "EXPORTS" section

答案 1 :(得分:1)

带有DLL的静态LIB或(小)LIB都需要头文件(或显式函数声明)。但是,LIB之间的差异是:

  • (动态)DLL :.LIB就像一个头文件,而.DLL文件就像一个.CPP文件。就像包含声明的头一样,.LIB包含导入定义。就像CPP包含定义一样,.DLL包含实际代码。
  • 静态LIB :就像整个类在.H中实现(主要是模板的情况),并且没有附加的.CPP文件 - 这种LIB包含所有代码计划工作。就像,链接器不会抱怨缺少实现(在上面的情况下为.CPP),加载器(OS)不会抱怨缺少DLL。

    基于DLL的库很小,静态库很大(在这里加上.H / .CPP类比)。