在mingw中使用msvc lib

时间:2011-08-15 10:59:07

标签: visual-c++ dll mingw

我有一个带有开发工具的硬件(xray传感器)。但是afaiu这些都是用msvc构建的。所以我有一个.lib文件和.dll文件。如果我将这个lib文件包含到我的项目中(我正在使用qt),并将dll文件放到exe文件夹中并使用MSVC-Release选项进行编译everytihng有效。但是当我尝试使用mingw-Release选项进行编译时。它失败了。

imp __ ZN6IDcDrv6CreateEPKci'的未定义引用

imp __ ZN6IDcDrv14GetDeviceCountEv'的未定义引用

你能指出一些方法,以便我可以使用这些lib。和使用mingw编译器的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

注意此文件中的最后一个条目(创建。)我试图在程序中调用它并且我得到

(.text+0x1ad): undefined reference to `_imp___ZN6IDcDrv6CreateEPKci'

如果我更换线?创建@ IDcDrv @@ SAPAVDcDrv @@ PBDH @ Z

使用 imp __ ZN6IDcDrv6CreateEPKci进行编译,但会出错。

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

4 个答案:

答案 0 :(得分:1)

看到这个: How to use libraries compiled with MingW in MSVC?

我的意思是围绕#include与extern“C”块。 因为使用extern“C”将指示编译器函数使用C链接,而不是C ++,这将阻止它对函数执行名称修改。

我认为名称错位导致联系问题。 不知道这有助于自动使用dll。希望它会。 因为我需要在MSVC 2005中编写一个基于CUDA的dll并在mingw中使用它。

希望这有帮助。 : -

答案 1 :(得分:0)

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

答案 2 :(得分:0)

这里有一个简单的问题:名称修改方案,即从可能重载名称的C ++函数到仅按名称标识函数的字符串的映射,对于MS编译器和GCC是不同的。因此,函数名称是不同的,并且MingW搜索其自己的错位名称格式(_ZN6IDcDrv6CreateEPKci),并且找不到微软的名称( ?Create@IDcDrv@@SAPAVDcDrv@@PBDH@Z)。

现在,如果这两个库真正使用C ++功能,那就更好了。假设您将C ++字符串从库中传递到程序中并返回 - 绝对无法保证字符串的MS实现与GNU实现是二进制兼容的,因此您可能最终会遇到令人讨厌的错误。 / p>

但是,如果这些函数的接口是C兼容的(可以用POD术语表示),则可以在extern "C"块中声明函数,从而禁用名称修改。看来你正在构建的lib的开发人员没有这样做。如果这是不必要的(抱歉,我无法将MSVC名称解析为函数签名,所以实在无法分辨),您应该针对库提交错误并让它们使用{{声明接口或尽可能大的部分1}}。如果这是不可能的,请在MSVC中编写一个包装器,调用它们的函数并在extern "C"内声明自己的函数。

答案 3 :(得分:0)

正如@thithon所说,你的问题是C名称错误。正如他所说,你应该做外部的" C"要避免的事情。

入口点错误是因为您的dll中可能没有main()。只需添加一个(即使它是空的,也无关紧要),并且该错误将消失。

相关问题