c++的64位名称篡改

64bit name mangling for c++

本文关键字:64位 c++      更新时间:2023-10-16

我有一段代码,它有以下行

#pragma comment(linker, "/include:_test@12") 

当我使用配置类型为32位的C++Visual Studio 2010编译代码时,使用此代码的项目运行良好(我也在32位的windows机器上)。

当我将计算机更改为64位并使用x64配置(使用C++Visual Studio 2010进行编译)时,我收到了一个链接错误。

32位和64位的C++名称篡改不同吗?如果是,我在哪里可以找到64位C++名称篡改约定?

是的,名称篡改在32位和64位之间是不同的。这里可以找到一篇涵盖确切格式的合理文章。然而,只需编译到两个目标并检查生成的映射文件,就可以很快地判断出主要的差异。根据我的经验,它们几乎完全相同(64位添加了一个小数据,可能会改变其他数据)。

简单示例:void foo();

32bit: ?foo@A@@QAEXXZ
64bit: ?foo@A@@QEAAXXZ

对于未损坏的std调用,根据参数堆栈的使用情况,长度后缀可能会有很大的不同。VC++的默认64位设置不加下划线,也不编码长度后缀。以下是使用纯开箱即用设置编译的32/64位配置:

extern "C" int _stdcall func2(int, int, char*);
32bit: _func2@12
64bit: func2

没有什么意义,是吗。

完成电路,解开_cdecl,完成以下操作:

extern "C" int _cdecl func2(int, int, char*);
32bit: _func2
64bit: func2

如果他们似乎不遗余力地让你知道你在进口或出口什么,那么证据表明你可能是正确的。