用c ++命名装饰或名称修改

时间:2017-06-25 19:40:09

标签: c++ visual-c++ dll cygwin name-mangling

我使用cygwin生成了dll文件,我试图在Visual Studio中使用它。

  1. 我将带有错位函数名的DEF(.def)文件作为cygwin编译的一部分。
  2. 使用作为MSVC一部分的lib.exe程序,我生成了.lib文件。
  3. 在MSVC中,我编写了一个程序,该程序使用了创建的lib文件中的函数。

    我收到了Linker错误。 当我检查了损坏的名称时,DEF文件中的名称与MSVC中引发的错误名称不同。 我对两者进行了解组,发现MSVC使用__cdecl关键字破坏了函数名称。

    如何使用__cdecl关键字在cygwin中创建错位函数名?我错过了cgwin汇编中的任何标志吗?

    Visual Studio:
    被诅咒的名字:

      

    (__ imp_?configure_tls_context @客户@ asio_http2 @ @@ nghttp2 YA?AVerror_code @系统@ @@升压@ AAV456 @ AAVcontext SSL @ ASIO @ @@ 6 Z)

    解码名称:

      

    (__ imp_class boost :: system :: error_code __cdecl   nghttp2 :: asio_http2 ::客户:: configure_tls_context(类   boost :: system :: error_code&,类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&)

1 个答案:

答案 0 :(得分:3)

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

因此;始终使用完全相同的编译器重新编译所有源代码,或者为痛苦的世界做好准备。