用于c ++的64位名称修改

时间:2012-11-14 19:30:05

标签: c++ visual-studio-2010 64-bit name-mangling

我有一些代码,其中包含以下行

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

当我使用配置类型为32位的C ++ Visual Studio 2010编译代码时,使用此代码的项目工作正常(我也在32位Windows机器上)。

当我将机器更改为64位并使用使用C ++ Visual Studio 2010编译的x64配置时出现链接错误。

对于32位和64位,C ++名称是否有所不同?如果是这样,我在哪里可以找到64位C ++名称修改约定?

1 个答案:

答案 0 :(得分:8)

是的,名称重整在32位和64位之间是不同的。涵盖确切格式的合理文章可以是found here。您可以很快地告诉主要差异,但是,只需编译两个目标并检查生成的地图文件。根据我的经验,他们几乎相同(64位添加了一个小数据,可能会改变其他数据)。

简单示例:void foo();

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

对于非损坏的标准调用,长度后缀可能大不相同,具体取决于参数堆栈的使用情况。 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

如果看起来他们不顾一切地让你知道你在拉出或出口的东西,证据表明你可能是正确的。