C 中的视觉名称装饰或名称熔断

visual Name decoration or name mangling in c++

本文关键字:视觉      更新时间:2023-10-16

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

  1. 我在Cygwin编译的一部分中获得了带有函数名称的DEF(.DEF(文件。
  2. 使用作为MSVC的一部分出现的lib.exe程序,我生成了.lib文件。

在MSVC中,我编写了一个程序,该程序使用了创建的LIB文件的函数。

我有链接器错误。当我检查被操纵的名称时,DEF文件中的名称与MSVC中丢弃的错误中的名称不同。我脱离了两个,发现MSVC已用__cdecl关键字将功能名称汇总。

如何使用__cdecl关键字在Cygwin中创建混乱的功能名称?我是否错过了CGWIN编译中的任何标志?

Visual Studio:
混乱的名称:

(__ imp_?configure_tls_context@client@asio_http2@nghttp2@@@ya?averror_code@system@boost@boost@boost @@ aav456@aavcontext@aavcontext@ssl@ssl@ssl@asio@asio@asio@asio@6@@z(

脱词名称:

(__ imp_class boost :: system :: error_code __cdecl nghttp2 :: asio_http2 :: client :: configure_tls_context(class( boost :: system :: error_code&,class boost :: asio :: ssl :: context&(

cygwin的def文件:混乱的名称:

_zn7nghttp210asio_http26client21configure_tls_contextern5boost6system6system10err_codeerns2_4asio3ssl7contexte

脱词名称:

nghttp2 :: asio_http2 :: client :: configure_tls_context(boost :: system :: error_code&,boost :: asio :: asio :: assl :: ssl :: ssl :: context& amp;(

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

so;始终使用完全相同编译器或为痛苦世界做好准备。