可能重复:
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"
可以解决问题。我如何摆脱破坏?感谢。
答案 0 :(得分:8)
摆脱破坏的方法:(假设MSVC是构建环境)
通过.DEF文件导出。
导出为extern“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