【发布时间】:2017-11-28 17:08:38
【问题描述】:
我已经使用 cygwin 生成了 dll 文件,我正在尝试在 Visual Studio 中使用它。
- 作为 cygwin 编译的一部分,我得到了带有错误函数名称的 DEF(.def) 文件。
- 使用作为 MSVC 一部分的 lib.exe 程序,我生成了 .lib 文件。
在 MSVC 中,我编写了一个程序,该程序使用了创建的 lib 文件中的函数。
我收到链接器错误。
当我检查损坏的名称时,DEF 文件中的名称与 MSVC 中引发的错误中的名称不同。
我对两者都进行了分解,发现 MSVC 使用 __cdecl 关键字破坏了函数名称。
如何在 cygwin 中使用 __cdecl 关键字创建错位函数名称?我在 cgwin 编译中是否缺少任何标志?
Visual Studio:
损坏的名称:
(__imp_?configure_tls_context@client@asio_http2@nghttp2@@YA?AVerror_code@system@boost@@AAV456@AAVcontext@ssl@asio@6@@Z)
拆解的名称:
(__imp_class boost::system::error_code __cdecl nghttp2::asio_http2::client::configure_tls_context(类 boost::system::error_code &,class boost::asio::ssl::context &)
来自 Cygwin 的 DEF 文件: 乱七八糟的名字:
_ZN7nghttp210asio_http26client21configure_tls_contextERN5boost6system10error_codeERNS2_4asio3ssl7contextE
拆解的名称:
nghttp2::asio_http2::client::configure_tls_context(boost::system::error_code&, boost::asio::ssl::context&)
【问题讨论】:
-
这不仅仅是您必须处理的名称修改问题,还可能涉及调用约定和其他问题,例如 POSIX 兼容性。为什么不简单地用 VC++ 重新编译这个库呢?或者简单地使用 Cygwin GCC 编译所有内容。
-
我按照此链接cygwin.com/faq/faq.html#faq.programming.msvcrt-and-cygwin 中的步骤操作。根据该链接中提供的解决方案,我认为在 cygwin 中生成的 dll 可以在 MSVC 中使用,并且我在 Cygwin 中缺少一些编译器标志,因此我面临链接器错误。用 VC++ 重新编译库是我最后的选择。
标签: c++ visual-c++ dll cygwin name-mangling