C++ c+的64位名称损坏+;
我有一段代码如下C++ c+的64位名称损坏+;,c++,visual-studio-2010,64-bit,name-mangling,C++,Visual Studio 2010,64 Bit,Name Mangling,我有一段代码如下 #pragma comment(linker, "/include:_test@12") < >使用该代码的项目在使用C++ VisualStudio 2010编译代码时,工作状态良好,配置32位(我也是32位Windows机器)。 p>当我将机器改为64位时,会得到链接错误,并使用X64配置,用C++ Visual Studio 2010编译。p> 是32位与64位的C++名字不同吗?如果是,我在哪里可以找到64位C++名字的约定规则? < P>是的,32到64位的
#pragma comment(linker, "/include:_test@12")
< >使用该代码的项目在使用C++ VisualStudio 2010编译代码时,工作状态良好,配置32位(我也是32位Windows机器)。
<> p>当我将机器改为64位时,会得到链接错误,并使用X64配置,用C++ Visual Studio 2010编译。p>
是32位与64位的C++名字不同吗?如果是,我在哪里可以找到64位C++名字的约定规则?
< P>是的,32到64位的名字是不同的。一篇涵盖确切格式的合理文章可以是。不过,只需对两个目标进行编译并检查生成的映射文件,就可以很快看出主要差异。根据我的经验,它们几乎是相同的(64位增加了一个小数据,可能会改变其他数据) 简单示例:void foo()代码>
对于未损坏的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
如果他们似乎不厌其烦地让你知道你在输入或输出什么,证据表明你可能是正确的。事实上可能完全不同。。。如果test
接收到三个指针参数,则它将从12
变为24
。。。啊,这也不是C++函数。这似乎是一个stdcall
C函数。我从哪里可以了解到这一点。我不熟悉这些概念。我认为我的是stdcall,你举的例子是cdecl。我还有其他几个电话,比如#pragma comment(linker,“/export:test@0=测试“)我应该如何更改这些。一个参考说明将是非常好的。有很多关于C++名字的文档(我把你链接到其中的一个)。您似乎正在使用extern“C”\u stdcall进行导出,如上所示,这在32位和64位中是不同的。微软和维基上到处都是文章。虽然与VB有关,但我喜欢它,因为它能很好地谈论它。无论如何,恐怕您必须将您的#pragmas清理到#ifdef WIN64,然后导入或导出适当的名称。据我所知,64位系统唯一可用的调用约定是vectorcall
和默认的x64调用约定(这似乎是我在网上可以找到的快速调用的一个版本)。因此,\uuuuu cdecl
、\uu stdcall
、\uu快速调用
和\uu thiscall
在编译为64位时都被忽略。维基百科页面已迁移到:
extern "C" int _cdecl func2(int, int, char*);
32bit: _func2
64bit: func2