【问题标题】:How do I link a DLL to my project? error LNK2019: unresolved external symbol如何将 DLL 链接到我的项目?错误 LNK2019:未解析的外部符号
【发布时间】:2013-02-11 23:32:20
【问题描述】:

我有一个文件foo.h,其中包含各种函数声明。所有这些功能都在文件foo.dll 中实现。但是,当我包含 .h 文件并尝试使用任何功能时,我收到错误:

bar.obj : error LNK2019: unresolved external symbol SomeFunction

显然没有找到函数实现。

我必须做些什么来帮助编译器找到 DLL 中的定义并将它们与 .h 文件相关联?

我看过一些关于 __declspec(dllexport)__declspec(dllimport) 的东西,但我仍然不知道如何使用它们。

【问题讨论】:

  • 您是否将您的可执行文件与foo.dll(通常命名为foo.lib)的导入库链接?
  • 我是新手,所以我不太确定这是怎么做的。这在 Visual Studio 的项目属性中吗?
  • @xcdemon05,是的,在链接器选项中。

标签: c++ windows function dll linker


【解决方案1】:

您应该至少收到 三个 来自 DLL 所有者的文件。您在运行时需要的 DLL,带有导出函数声明的 .h 文件,您已经拥有了。还有一个 .lib 文件,即 DLL 的导入库。链接器需要它,因此它知道如何将函数添加到程序的导入表中。

您错过了告诉链接器它需要链接 .lib 文件的步骤。它需要添加到项目的链接器的 Input + Additional Dependencies 设置中。或者最容易通过在源代码中编写链接器指令来完成:

#include "foo.h"
#pragma comment(lib, "foo.lib")

这适用于 MSVC,否则不可移植,但链接永远不会。将 .lib 文件复制到您的项目目录或指定完整路径。

【讨论】:

  • 使用#pragma comment和添加lib文件到Project Properties > Linker > Input有区别吗?
  • 没有区别,您根本不能忘记更改该设置。
【解决方案2】:

我刚刚遇到了类似的问题。解决方案原来是 DLL 是 64 位的,而使用它的简单应用程序是 32。我忘记在配置管理器中将其更改为 x64。

【讨论】:

  • 在互联网上搜索了三个小时后,您刚刚拯救了我的一天。
  • 这是三年多以前的事了,我每次都犯同样的错误。祝福你的灵魂,DarenW。
【解决方案3】:
  1. 构建dll时需要在函数定义前指定__declspec(dllexport)关键字
  2. 您需要将 .dll 文件导入或加载到进程内存中。
  3. 您需要从该 dll 中获取要使用的函数的地址。

一些有用的开始链接:: MSDN Documentation, SO, Random

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-12-21
    • 1970-01-01
    • 2021-04-30
    • 2012-10-31
    • 2012-08-31
    相关资源
    最近更新 更多