Unmangling C ++ DLL函数名称

时间:2011-01-25 15:11:14

标签: c++ dll

  

可能重复:
  How do I stop name-mangling of my DLL's exported function?

我有一个用C ++编写的DLL。导出的函数名称需要解除标记。例如,int MyFunc( int Param1, int Param2 );需要出现在尝试将库函数调用为MyFunc的外部应用程序中。但是,当我使用Dependency Walker查看它时,它看起来像_MyFunc@8。这就是我在C ++中声明的方式:

extern "C" __declspec(dllexport) int WINAPI MyFunc( int Param1, int Param2 );

我认为extern "C"可以解决问题。我如何摆脱破坏?感谢。

5 个答案:

答案 0 :(得分:8)

摆脱破坏的方法:(假设MSVC是构建环境)

通过.DEF文件导出。

导出为ex​​tern“C”,确保使用__cdecl调用约定。即使使用extern“C”,__ stdcall也会在_之后添加@并在@dll导出函数上张贴@。

extern "C" __declspec(dllexport) int __cdecl MyFunc(int Param1, int Param2);

使用#pragma指令导出。您需要在此另一侧传递完全受损的名称。 __FUNCDNAME__是一个有用的指令,用于在函数中放入一个宏来列出其装饰名称

#pragma comment(linker, "/EXPORT:MyFunc=_MyFunc@8");

答案 1 :(得分:3)

前导下划线和@8后缀不是来自C ++名称修改,而是表示 stdcall 调用约定,这对于 dllexport 是正常的。

答案 2 :(得分:2)

这可能是因为你没有在函数定义中放置extern "C" declspec,你只把它放在声明上。

答案 3 :(得分:0)

在标题( .h )上,将其定义为:

extern "C" 
{
  __declspec(dllexport) int __stdcall MyFunc( int Param1, int Param2 );
}

然后,关于函数的实现( .cpp ):

extern "C"
{
  __declspec(dllexport) int __stdcall MyFunc( int Param1, int Param2 )
  {
     // ... code ...
  }
}

答案 4 :(得分:0)

在Gnu系统上有 c ++ filt