C++ 如何禁用C++;7.1名称损坏?:( 编写的库代码
我设法在VS2010中编译了它。现在我也需要在VS2003中编译它 问题是,我无法防止VS2003名称损坏 我在函数名之前使用了\uuuuudeclspec(dllexport)\uuuustdcall,我还将代码放在外部“C”块中 当我在VS 20003中编译它时,我仍然会弄乱函数名。当我使用u declspec(dllexport)时,我不需要.def文件,对吗 hee是代码:C++ 如何禁用C++;7.1名称损坏?:( 编写的库代码,c++,visual-c++,visual-studio-2003,C++,Visual C++,Visual Studio 2003,我设法在VS2010中编译了它。现在我也需要在VS2003中编译它 问题是,我无法防止VS2003名称损坏 我在函数名之前使用了\uuuuudeclspec(dllexport)\uuuustdcall,我还将代码放在外部“C”块中 当我在VS 20003中编译它时,我仍然会弄乱函数名。当我使用u declspec(dllexport)时,我不需要.def文件,对吗 hee是代码: extern "C" { void __declspec(dllexport) __stdcall Fre
extern "C"
{
void __declspec(dllexport) __stdcall FreeMyObject(MyObjectHandle pObj)
{
delete pObj;
}
}
“Callin约定”也是cdecl(/Gd)
为什么我的函数名被弄乱了?我需要在编译器选项中设置任何选项吗?关键字
\u stdcall
,以及\u cdecl
,\u thiscall
和其他,都是调用约定,指定编译器如何处理推送和弹出参数和返回值。函数名使用tdcall(至少在visual studio中)在导出时是“修饰”的。如果要查找导出的函数名,可以使用visual studio命令行函数DUMPBIN/EXPORTS“DLL file location”
。函数名可能如下所示:\u freemoyObject@(一些数字)
。您也可以使用.def文件并自己定义名称,但我个人认为这很痛苦。它将被装饰为_FreeMyObject@4StDeCar修饰。与C++名字的不一样。它与C.不兼容。如果你想重命名它,那么你必须使用.DEF文件。谢谢,因为它是S。那么编译器在VS2010中的行为会有所不同吗?因为它在没有def文件的情况下工作得很好。顺便说一下,谢谢你的回答:)这种方式已经很长很长时间了。VS2010没有什么不同。唯一合理的猜测是您正在VS2010项目中构建64位代码。它不需要名字修饰,只有一个呼叫约定。你不会留下任何其他东西来猜测。这可能是一个没有C++ 7.1的副本,只有C++ 98, 03,11, 14, 17,20…