如何在Visual Studio中链接dll?

Sta*_*ark 1 c++ dll dynamic-linking visual-studio

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

要使用 dll,我需要 .dll 和 .lib。这个.lib和上面的一样还是不一样?如何让 Visual Studio 使用 .dll 和 .lin,而不仅仅是 .lib?我将 .dll 放入项目目录中,但没有任何更改(.exe 具有相同的大小(我认为应该更小))。

Cod*_*ray 5

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

\n\n

这与编译静态库时获得的 LIB 文件有很大不同。LIB 文件包含组成该库的所有目标代码。当您构建它时,所有此类代码都会直接链接到您的可执行文件\xe2\x80\x94,因此名称的“静态”部分。

\n\n

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

\n\n

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

\n\n

编辑:当您构建 DLL 时,您当然不会获得 LIB 文件,除非 DLL 导出函数。(如果它不导出任何函数,则该 DLL 的客户端无法调用任何内容,因此没有必要使用 LIB 文件!)安排从 DLL 导出函数的最简单方法DLL就是使用__declspec(dllexport)注解的。如果与宏结合使用,您可以将其解析为__declspec(dllimport)消费者端,从而允许您使用相同的头文件来构建 DLL 并从应用程序使用它。有关更多信息,请参阅我的回答。或者,您可以使用带有“EXPORTS”部分的 DEF 文件

\n

  • 有关“__declspec(dllexport)”的更多信息,请参阅[此处](http://stackoverflow.com/q/8863193/8863220#8863220)。至于关于下载的 DLL 的第二个问题,如果要与 Microsoft 的编译器和链接器一起使用,下载的文件应包含 LIB 文件。如果没有,是的,您将必须使用 LoadLibrary 和 GetProcAddress 动态调用函数。或者您可以手动为 DLL 创建自己的 LIB 文件。使用 dumpbin /exports 获取导出函数的列表,将名称放入 DEF 文件中,然后通过链接器运行它:lib /def:MyDef.DEF /OUT:MyLib.lib (2认同)