【问题标题】:Linking DLL with .DEF or .LIB file将 DLL 与 .DEF 或 .LIB 文件链接
【发布时间】:2011-09-20 22:05:35
【问题描述】:

注意:我对 C++ 一无所知。我很习惯使用 C#,但这让我很困惑。

我知道这是一个常见问题,但过去几个小时我一直很沮丧 - 主要是因为它应该非常简单。

我正在尝试将 DLL 导入 VC++ 2010,但我终其一生都想不出“好”的方法。我有包含定义的标头,以及我已使用“lib”转换为 .lib 文件的 .DEF 文件。

我想要做的就是能够调用包含在 DLL 中的函数!当我尝试将其添加为引用时,出现以下错误:无法添加对文件 WindowsAccessBridge.dll 的引用,因为它既不是 .NET 程序集也不是已注册的 ActiveX 控件。

我可以使用 LoadLibrary/GetProcAddress 访问这些函数,但我真的希望有一个“插入式”解决方案,这并不意味着我必须为 50 多个函数编写代码。

TL;DR:我如何将原生 C++ dll 导入我的项目,以便调用它的函数?我有 .lib、.def 和 .dll 文件。你的举动?

编辑 - 我意识到正确的答案是“学习你想要写的语言”。 - 但我真的希望有一种简单的方法来完成这项工作。

代码:

#include "StdAfx.h"
#include "WABAPI.h"
#include "AccessBridgeCalls.h"

WABAPI::WABAPI(void)
{
}

void WABAPI::Init()
{
    initializeAccessBridge();
}

这是我在链接器中的设置:

【问题讨论】:

  • 有一些证据表明您成功地跳过了障碍以获取 DLL #included 和链接。没有证据表明您实际上是在尝试调用它的任何导出函数。 wabapi.cpp 实际上是您的 EXE 项目的一部分吗?执行如何从 main() 流向 Init() 函数?
  • 抱歉,我正在从 button_click 事件创建一个新的 WABAPI 实例,然后从那里调用 WABAPI.Init()。在此期间只是为了测试目的而这样做 - 这不是最终将如何使用它。此外,至于链接,它不起作用。使用上面列出的设置,我仍然收到错误:error LNK2028: unresolved token (0A000008) "extern "C" int __cdecl initializeAccessBridge(void)" (?initializeAccessBridge@@$$J0YAHXZ) 在函数“public: void __clrcall WABAPI”中引用::Init(void)" (?Init@WABAPI@@$$FQ$AAMXXZ)
  • 所以你从 .def 组成了一个 .lib 文件。并且可能制作了一个 .h 文件。 .def 对函数名有什么看法?它是否以@@$$FQ$AAMXXZ 结尾?您可能没有正确声明它,extern "C" 很常见。联系 DLL 所有者以获取使用该 DLL 所需的文件。
  • 我从一个 .def 文件创建了一个库,由 Oracle(DLL 所有者)提供给我。他们还提供了它的源代码,但我无法使用 /clr 标志编译它,所以我想我会像在 C# 中一样使用 DLL(使用 DLLImport)。因此,我发现自己现在的情况。我正在寻找的是一种仅使用其中包含的功能的方法。我不再关心“正确”或“简单”的方式了——只要一种可行的方式就好了。感谢您抽出宝贵的时间做出回应:-)
  • @HeWhoWas 您在上面发布的错误意味着您没有链接到任何定义该功能的东西。让我们看看 .def 和 .h

标签: visual-c++ dll linker


【解决方案1】:

您将标头包含在源代码中:

#include <your_header.h>

然后你告诉链接器使用 .lib 文件:

这张图是VS 2008的,不过如果没记错的话,VS 2010的布局也差不多。

【讨论】:

  • 您好,感谢您的回答!我自己也得出了同样的逻辑结论,但一直无法让它发挥作用。似乎将我所有导入的函数都视为“不可执行代码”。如果您不介意看一下,我已经更新了原始帖子以包含更多信息。编辑 - 请记住,lib 文件已生成,我不确定如何确认它是否正常工作...
猜你喜欢
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多