如何在 visual studio 中 link dll?

How to link dll in visual studio?

为了 link 静态库,我必须从 .h 和 .c 文件创建 .lib。 然后我将它添加到我的项目中,放入附加依赖项并编译。

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

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

这和编译静态库得到的LIB文件有很大的不同。 That LIB 文件包含构成库的所有目标代码。当您构建可执行文件时,所有此类代码都会直接链接到您的可执行文件中——因此名称的 "static" 部分。

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

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

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

中有更多相关信息

静态 LIB 或带有 DLL 的(小型)LIB,两者都需要 header 文件(或显式函数声明)。但是,不同的 LIB 是:

  • (Dynamic) DLL: .LIB 就像一个 header 文件,而 .DLL 文件就像一个 .CPP 文件。就像包含声明的 header 一样,.LIB 包含导入定义。就像 CPP 包含定义一样,.DLL 包含实际代码。

  • Static LIB: 就像整个 class 是在 .H 中实现的(主要是在模板的情况下),并且没有附加的 .CPP 文件- 这种 LIB 包含程序运行的所有代码。就像,链接器不会抱怨缺少实现(在上面的例子中是.CPP),加载器(OS)不会抱怨缺少 DLL。

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