【问题标题】:How do I change the exported name decoration for __stdcall in VC++?如何在 VC++ 中更改 __stdcall 的导出名称装饰?
【发布时间】:2011-05-28 18:15:13
【问题描述】:

这就是我现在声明导出函数的方式:

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

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

_GetExported_Class@0

为了与其他编译器兼容,我需要将上面的装饰改成如下所示:

GetExported_Class

将调用约定更改为 __cdecl 会将其装饰成我想要的方式,但约定是错误的,所以我不能使用它。我需要按照 __cdecl 的外观装饰它,但使用 __stdcall 代替。

有没有办法做到这一点没有使用.def文件?是否有我可以传递给 link.exe 链接器的开关或选项,可以让它按照我想要的方式装饰导出名称?

谢谢

【问题讨论】:

    标签: c++ dll export name-decoration


    【解决方案1】:

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

    【讨论】:

    • 谢谢,我想我只能硬着头皮去做了。不遵循约定的“其他”编译器恰好是 MinGW gcc 4.5.1 和 Borland 5.93(C++ Builder 2007)。他们都只是吐出了未修饰的函数名称——至少当我用 pe 查看器打开它来检查导出表时。
    【解决方案2】:

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

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

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

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

    【讨论】:

    • 主要是因为它是额外的维护工作。试图看看是否有更简单的方法来简化这一点。
    【解决方案3】:

    是的:

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

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

    甚至更简单:在函数体内使用

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

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

    【讨论】:

      猜你喜欢
      • 2012-02-28
      • 1970-01-01
      • 2011-10-02
      • 1970-01-01
      • 1970-01-01
      • 2020-03-10
      • 1970-01-01
      • 1970-01-01
      • 2016-10-24
      相关资源
      最近更新 更多