如何在C ++中更改__stdcall的导出名称修饰?

时间:2010-12-21 10:48:12

标签: c++ dll export name-decoration

这就是我现在宣布导出函数的方法:

extern "C" __declspec(dllexport)
Iexport_class* __stdcall GetExported_Class();

当VS2008为此编译源代码时,生成的dll在其导出表下包含此内容:

_GetExported_Class@0

为了与其他编译器兼容,我需要将上面的装饰看起来像这样:

GetExported_Class

将调用约定更改为__cdecl会将其修改为我想要的方式但是约定会出错,所以我不能使用它。我需要以__cdecl看起来的方式进行装饰,而是使用__stdcall。

无论如何没有使用.def文件吗?是否有可以传递给link.exe链接器的开关或选项,它可以使导出名称按照我想要的方式进行装饰?

由于

3 个答案:

答案 0 :(得分:3)

没有。所有__stdcall名称都以这种方式装饰。我很惊讶你有一些其他编译器不会期望__stdcall导出像这样装饰。使用.def覆盖链接器几乎是你所能做的 - 除非你想在生产后改变PE文件。

答案 1 :(得分:2)

我不明白为什么你不想使用.def文件,但这是你唯一的选择。

链接器支持导出开关,但它不能与__stdcall注释的函数一起使用:

http://msdn.microsoft.com/en-US/library/7k30y2k5.aspx

def文件方式几乎是唯一的解决方案。

答案 2 :(得分:0)

是:

您可以将/EXPORT添加到lib.exe命令行,或将#pragma添加到源文件中:

#pragma comment(linker, "/EXPORT:SomeFunction=_SomeFunction@@@23mangledstuff#@@@@")

甚至更容易:在函数体内使用

#pragma comment(linker, "/EXPORT:" __FUNCTION__ "=" __FUNCDNAME__)

来源:https://stackoverflow.com/a/2805560/280534