【问题标题】:using msvc lib in mingw在 mingw 中使用 msvc lib
【发布时间】:2011-08-15 10:59:07
【问题描述】:

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

对 `imp__ZN6IDcDrv6CreateEPKci' 的未定义引用

对 `imp__ZN6IDcDrv14GetDeviceCountEv' 的未定义引用

你能指出一些出路,以便我可以使用这些库。和 dll 文件使用 mingw 编译器

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'

如果我替换线 ?Create@IDcDrv@@SAPAVDcDrv@@PBDH@Z

使用 imp__ZN6IDcDrv6CreateEPKci 编译,但给出错误。

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

【问题讨论】:

    标签: visual-c++ dll mingw


    【解决方案1】:

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

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

    我认为名称修改会导致链接出现问题。 不知道这是否有助于自动使用 dll。希望会。 因为我需要在 MSVC 2005 中编写一个基于 CUDA 的 dll 并在 mingw 中使用它。

    希望对您有所帮助。 :-?

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 确实如此。所以我试图找到一种方法将这个 dll 和 lib 导出为 .a 格式,以便我可以将它与 mingw 链接。如果我是正确的 dll 文件可以用于 .lib 和 .a 文件。
      • 非常酷。我会密切关注这个,看看你是否找到了解决方案,因为我一直对这样做感到好奇。
      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          猜你喜欢
          • 2012-07-09
          • 1970-01-01
          • 1970-01-01
          • 2021-11-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多