8

当我们在 Visual Studio 2008 中使用 __stdcall 编译 dll 时,dll 中的编译函数名称是。

函数名

虽然当我们使用 GCC 使用 wx-dev-cpp 编译相同的 dll 时,GCC 会附加函数具有的参数数量,所以使用 Dependency walker 的函数的名称看起来像。

FunctionName@numberOfParameters 或 == FunctionName@8

你如何告诉 GCC 编译器从 dll 中的导出符号中删除 @nn?

4

3 回答 3

6

__stdcall 通过在开头添加下划线和在末尾添加参数的字节数(以@分隔)来装饰函数名称。

所以,一个函数:

void __stdcall Foo(int a, int b);

...会变成 _Foo@8。

如果您在 .DEF 文件的 EXPORTS 部分中列出函数名称(未修饰),则将其导出为未修饰。

也许这就是区别?

于 2008-09-20T07:53:07.750 回答
6

只需-Wl,--kill-at在 gcc 命令行上使用,它将传递--kill-at给链接器。

参考:

于 2008-10-31T20:08:53.700 回答
1

您还可以使用-Wl,--add-stdcall-aliasGCC 中的链接器选项。这将确保两个函数名称(装饰和未装饰)都存在并且可以用作别名。

于 2014-06-10T09:14:43.363 回答