在mingw中使用msvc库

6
我有一款硬件(X射线传感器),带有开发工具。但据我所知,这些工具是使用MSVC构建的。因此,我有一个.lib文件和一个.dll文件。如果我将这个lib文件包含到我的项目中(我正在使用Qt),并将dll文件放在exe文件夹中,并使用MSVC-Release选项编译,一切都可以运行。但是当我尝试使用mingw-Release选项编译时,它会失败。
指向“imp__ZN6IDcDrv6CreateEPKci”的未定义引用
指向“imp__ZN6IDcDrv14GetDeviceCountEv”的未定义引用
您能指出一些方法,让我可以使用mingw编译器来使用这些lib和dll文件吗?
PS: 我尝试了但失败了 impdef dclibsn.dll>dclib.def
dlltool -dllname dclibsn.dll --def dclib.def --output-lib libdclibsn.a
这是我的def文件的样子
LIBRARY "dclibsn.dll"
EXPORTS
??0DcDrv@@QAE@ABV0@@Z
??0DcDrv@@QAE@V?$CStringT@DV?$StrTraitMFC_DLL@DV?$ChTraitsCRT@D@ATL@@@@@ATL@@@Z
??0IDcDrv@@QAE@ABV0@@Z
??0IDcDrv@@QAE@XZ
??1DcDrv@@QAE@XZ
??4DcDrv@@QAEAAV0@ABV0@@Z
??4IDcDrv@@QAEAAV0@ABV0@@Z
?CaptureImage@DcDrv@@AAE_NHHHK_NHH@Z
?CloseUsbDevice@DcDrv@@AAE_NXZ
?ColumnDefectComp@DcDrv@@AAEGPBGH@Z
?CompensationImage@DcDrv@@AAEXPAGQAEHH@Z
?Create@IDcDrv@@SAPAVDcDrv@@PBDH@Z

请注意文件中的最后一个条目(Create.)。我正在尝试在程序中调用它,但是遇到了问题。
(.text+0x1ad): undefined reference to `_imp___ZN6IDcDrv6CreateEPKci'

如果我将行?Create@IDcDrv@@SAPAVDcDrv@@PBDH@Z替换为imp__ZN6IDcDrv6CreateEPKci,代码会编译通过,但是会出现错误。

The procedure entry point _ZN6IDcDrv6CreateEPKci could not be located in the dynamic link library dclibsn.DLL. 
4个回答

1
看这里: 如何在MSVC中使用使用MingW编译的库? 我的意思是用extern "C"块包围#include。 因为使用extern "C"会告诉编译器函数使用的是C链接,而不是C++,这将阻止它对函数进行名称修饰。
我认为名称修饰会导致链接问题。 不知道这是否有助于自动使用dll。希望如此。 因为我需要在MSVC 2005中编写基于CUDA的dll并在mingw中使用它。
希望这可以帮到你。 :-?

0

正如@thithon所指出的那样,你的问题是C名称修饰。如他建议的那样,你应该使用extern "C"来避免这种情况。

入口点错误可能是因为你的dll中没有main()函数。只需添加一个(即使它是空的,也没关系),那个错误就会消失。


0

我肯定不是这个问题的专家,但我一直认为使用mingw构建的项目无法使用来自msvc项目的任何dll或库,因为它们是用不同的编译器构建的。


这是真的。所以我正在尝试找到一种将这个dll和lib导出为.a格式的方法,以便我可以将它与mingw链接。如果我没错的话,dll文件可以用于.lib和.a文件。 - ardavar
非常酷。我会密切关注这个,看看您是否找到了解决方案,因为我已经对此感到好奇有一段时间了。 - NeilMonday

0
你在这里遇到了一个简单的问题:MS编译器和GCC的名称修饰方案,即从可能具有重载名称的C++函数映射到仅通过名称标识函数的字符串的方案是不同的。因此,函数名称是不同的,而MingW搜索自己的名称格式(_ZN6IDcDrv6CreateEPKci),无法找到微软的名称格式(?Create@IDcDrv@@SAPAVDcDrv@@PBDH@Z)。
现在,如果这两个库确实使用了C++特性,那就更好了。假设你将一个C++字符串从库传递到你的程序中,然后再传回去-绝对没有保证MS字符串实现与GNU实现是二进制兼容的,所以你可能会遇到严重的错误。

然而,如果这些函数的接口是C兼容的(可以用POD术语表示),您可以在extern "C"块中声明这些函数,从而禁用名称重整。看起来您正在构建的库的开发人员没有这样做。如果这是不必要的(抱歉,我无法将MSVC名称解码为函数签名,因此无法确定),您应该针对该库提交错误报告,并让他们使用extern "C"声明接口或尽可能大的部分。如果这是不可能的,请在MSVC中编写一个包装器,调用他们的函数并在extern "C"中声明自己的函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接