这就是我现在宣布导出函数的方法:
extern "C" __declspec(dllexport)
Iexport_class* __stdcall GetExported_Class();
当VS2008为此编译源代码时,生成的dll在其导出表下包含此内容:
_GetExported_Class@0
为了与其他编译器兼容,我需要将上面的装饰看起来像这样:
GetExported_Class
将调用约定更改为__cdecl会将其修改为我想要的方式但是约定会出错,所以我不能使用它。我需要以__cdecl看起来的方式进行装饰,而是使用__stdcall。
无论如何没有使用.def文件吗?是否有可以传递给link.exe链接器的开关或选项,它可以使导出名称按照我想要的方式进行装饰?
由于
答案 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__)