8

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

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

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

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

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

4

1 回答 1

10

是的,名称修饰在 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

没有什么意义,在那里。

完成电路,unmangled _cdecl,它执行以下操作:

extern "C" int _cdecl func2(int, int, char*);

32bit: _func2
64bit: func2

如果看起来他们特意让你知道你在拉入或输出什么,那么证据表明你可能是正确的。

于 2012-11-14T19:37:53.593 回答