如何在c ++中使用DLL

时间:2013-08-26 14:53:08

标签: c++ dll

我需要使用DLL编写c ++程序。我有DLL和头文件,但链接器没有.a文件。 GNU GCC编译器无法在DLL文件中找到这些函数。

我收到的错误如下:

    undefined reference to _imp__mbnEthernetOpen@8

如何解决此问题。

2 个答案:

答案 0 :(得分:3)

看起来您正在尝试编译依赖于另一个共享库的程序。要在Windows上编译支持这个库,通常需要做三件事:

  • 头文件
  • lib二进制文件用于编译时链接
  • 用于运行时执行的dll二进制文件(必须在二进制文件的路径中) 在运行时找到并加载) OPTIONAL 如果你静态链接.lib文件

您在评论中说,您所拥有的只是标题和dll文件。这意味着您要么缺少lib二进制文件,需要查找/重新编译库,或者您尝试在运行时动态加载DLL并使用函数指针调用不同的函数(正如Goksel在他的回答中提到的那样)。您的错误表明您正在尝试执行第一个选项(链接到共享库)。

如果要在编译时动态链接到库,则需要拥有lib文件。

答案 1 :(得分:1)

自从我上次使用WinAPI以来已经很长时间了但是如果我没记错的话,你需要使用LoadLibraryLoadLibraryEx在运行时动态加载库。之后,您需要使用GetProcAddress获取您感兴趣的特定功能的地址;在你的情况下,这将是mbnEthernetOpen(我猜)。

在所有这些麻烦之后,您最终可以通过刚刚从DLL获取的函数指针调用mbnEthernetOpen

编辑:在阅读完评论后,我决定扩展我的答案,以包含生成.lib文件的方法。

首先,VLCwiki写得非常好article,完整地完成了整个过程。但是,为了清楚起见,我将在此重复一遍。

  1. 开始菜单中找到并执行 Visual Studio命令提示符,根据Wiki应该在 Microsoft Visual Studio 进入。

  2. Visual Studio命令提示符上执行此命令行以从DLL文件中提取符号:dumpbin /exports input.dll > exports.def确保替换input.dll和{{ 1}}分别带有正确输入和输出文件的路径。

    此时,您可以启动文本编辑器并编辑新生成的exports.def文件,如下所示:

    .def

    显然,导出符号的名称对于您的DLL会有所不同。

    然而,无论出于何种原因,如果你不想手动完成所有这些操作,那些在VLC维基上写文章的酷男们想出了一个生成EXPORTS libvlc_add_intf libvlc_audio_get_channel libvlc_audio_get_mute libvlc_audio_get_track libvlc_audio_get_track_count libvlc_audio_get_track_description libvlc_audio_get_volume … 文件的一次性命令行自动:

    .def

    再次确保使用更正的等效项替换临时名称,另外注意echo EXPORTS > output.def for /f "usebackq tokens=4,* delims=_ " %i in (`dumpbin /exports input.dll`) do if %i==tag echo %i_%j >> exports.def 符号。在VLC的示例中,这是tag,它是示例中每个导出符号的初始部分。现在,既然你已向我们展示了一个功能,我不确定这应该是什么,但我相信你可以通过查看导出的符号来解决这个问题。

  3. 最后,从这些导出的符号中生成libvlc文件,这些符号现在位于.lib文件中: .def

    请注意,根据您的平台,lib /def:exports.def /out:library.lib /machine:x86可能会有所不同。

  4. 你去吧。这是您从/machine文件生成.lib文件的方法。