【问题标题】:Name decoration or name mangling in c++c++ 中的名称修饰或名称修饰
【发布时间】:2017-11-28 17:08:38
【问题描述】:

我已经使用 cygwin 生成了 dll 文件,我正在尝试在 Visual Studio 中使用它。

  1. 作为 cygwin 编译的一部分,我得到了带有错误函数名称的 DEF(.def) 文件。
  2. 使用作为 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


【解决方案1】:

作为一般规则;对于 C++ 代码,您始终需要使用完全相同的编译器为您的项目编译所有代码。这包括可执行文件以及所有静态和动态库。 C++ 没有 ABI 规范,所有编译器可能会以不同的方式修改名称,甚至编译器的新次要版本也可能生成与使用先前版本构建的代码不兼容的代码。 名称修饰或数据结构布局等没有标准。

所以;总是用完全相同的编译器重新编译所有源代码,否则就要为痛苦的世界做好准备。

【讨论】:

  • 我也认为相同的“编译器可能会以不同的方式处理名称”。我按照这个链接link 在MSVC 中使用cygwin 生成的dll。也许提供的解决方案仅适用于 C 而不是 C++。
猜你喜欢
  • 1970-01-01
  • 2018-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 2011-02-25
  • 2010-10-03
  • 2010-12-18
相关资源
最近更新 更多