【问题标题】:How to link dll in visual studio?如何在Visual Studio中链接dll?
【发布时间】:2016-10-18 01:18:59
【问题描述】:

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

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

【问题讨论】:

  • 一个 DLL 项目生成一个 import 库。与静态库不同,它非常小,仅声明您导出的函数。如果您没有获得 .lib 文件,则说明您没有正确构建它或忘记导出函数。
  • DLL 项目仅创建 .dll 文件。我找不到任何 .lib 文件

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


【解决方案1】:

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

这与编译静态库时得到的 LIB 文件非常不同。 那个 LIB 文件包含构成该库的所有目标代码。当你构建它时,所有这些代码都会直接链接到你的可执行文件中——因此是名称的“静态”部分。

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

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

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

【讨论】:

  • 创建和编译 DLL 项目(从 .c 和 .h 文件)后,我只得到 .dll 文件。没有.lib。
  • 还有一个问题:如何使用现有的预编译 .dll 而没有我从托管库的站点下载的 .lib 文件?我应该使用 LoadLibrary 和 GetProcAddress 函数吗?
  • @stark 它对我有用。我做了以下事情:向解决方案添加一个新项目,指定“Win32 项目”模板。在向导中,我选择了“DLL”。我用__declspec(dllexport)注释了我希望从DLL中导出的所有函数,然后我构建了项目。在输出文件夹中,我得到MyDLL.dll、MyDLL.exp、MyDLL.ilk、MyDLL.lib 和MyDLL.pdb。所以我猜你的问题是你没有从 DLL 导出任何函数。这使得 DLL 相当无用。
  • 有关__declspec(dllexport) 的更多信息,请参见here。至于第二个关于下载的 DLL 的问题,如果它打算与微软的编译器和链接器一起使用,下载应该包含一个 LIB 文件。如果没有,是的,您必须使用 LoadLibrary 和 GetProcAddress 动态调用函数。或者,您可以手动为 DLL 创建自己的 LIB 文件。使用dumpbin /exports获取导出函数列表,将名称放入DEF文件,并通过链接器运行:lib /def:MyDef.DEF /OUT:MyLib.lib
  • 哦,谢谢,我将 __declspec(dllexport) 放入定义中,并声明了我需要的所有函数,它起作用了。我注意到 __declspec(dllimport) 必须与对象声明一起使用(因为带有 extern 的对象声明不适用于 dll),但函数原型在没有 __declspec(dllimport) 的情况下可以正常工作。
【解决方案2】:

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

  • (动态)DLL:.LIB 类似于头文件,.DLL 文件类似于 .CPP 文件。就像包含声明的标题一样,.LIB 包含导入定义。就像 CPP 包含定义一样,.DLL 包含实际代码。

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

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

【讨论】:

    猜你喜欢
    • 2011-12-12
    • 2011-06-06
    • 2012-06-16
    • 2011-05-09
    • 1970-01-01
    • 2011-09-28
    • 2016-09-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多