我需要使用DLL编写c ++程序。我有DLL和头文件,但链接器没有.a文件。 GNU GCC编译器无法在DLL文件中找到这些函数。
我收到的错误如下:
undefined reference to _imp__mbnEthernetOpen@8
如何解决此问题。
答案 0 :(得分:3)
看起来您正在尝试编译依赖于另一个共享库的程序。要在Windows上编译支持这个库,通常需要做三件事:
您在评论中说,您所拥有的只是标题和dll文件。这意味着您要么缺少lib二进制文件,需要查找/重新编译库,或者您尝试在运行时动态加载DLL并使用函数指针调用不同的函数(正如Goksel在他的回答中提到的那样)。您的错误表明您正在尝试执行第一个选项(链接到共享库)。
如果要在编译时动态链接到库,则需要拥有lib文件。
答案 1 :(得分:1)
自从我上次使用WinAPI以来已经很长时间了但是如果我没记错的话,你需要使用LoadLibrary
或LoadLibraryEx
在运行时动态加载库。之后,您需要使用GetProcAddress
获取您感兴趣的特定功能的地址;在你的情况下,这将是mbnEthernetOpen
(我猜)。
在所有这些麻烦之后,您最终可以通过刚刚从DLL获取的函数指针调用mbnEthernetOpen
。
编辑:在阅读完评论后,我决定扩展我的答案,以包含生成.lib
文件的方法。
首先,VLC的wiki写得非常好article,完整地完成了整个过程。但是,为了清楚起见,我将在此重复一遍。
从开始菜单中找到并执行 Visual Studio命令提示符,根据Wiki应该在 Microsoft Visual Studio 进入。
在 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
,它是示例中每个导出符号的初始部分。现在,既然你已向我们展示了一个功能,我不确定这应该是什么,但我相信你可以通过查看导出的符号来解决这个问题。
最后,从这些导出的符号中生成libvlc
文件,这些符号现在位于.lib
文件中:
.def
请注意,根据您的平台,lib /def:exports.def /out:library.lib /machine:x86
可能会有所不同。
你去吧。这是您从/machine
文件生成.lib
文件的方法。