当我们在 Visual Studio 2008 中使用 __stdcall 编译 dll 时,dll 中的编译函数名称是。
函数名
虽然当我们使用 GCC 使用 wx-dev-cpp 编译相同的 dll 时,GCC 会附加函数具有的参数数量,所以使用 Dependency walker 的函数的名称看起来像。
FunctionName@numberOfParameters 或 == FunctionName@8
你如何告诉 GCC 编译器从 dll 中的导出符号中删除 @nn?
当我们在 Visual Studio 2008 中使用 __stdcall 编译 dll 时,dll 中的编译函数名称是。
函数名
虽然当我们使用 GCC 使用 wx-dev-cpp 编译相同的 dll 时,GCC 会附加函数具有的参数数量,所以使用 Dependency walker 的函数的名称看起来像。
FunctionName@numberOfParameters 或 == FunctionName@8
你如何告诉 GCC 编译器从 dll 中的导出符号中删除 @nn?
__stdcall 通过在开头添加下划线和在末尾添加参数的字节数(以@分隔)来装饰函数名称。
所以,一个函数:
void __stdcall Foo(int a, int b);
...会变成 _Foo@8。
如果您在 .DEF 文件的 EXPORTS 部分中列出函数名称(未修饰),则将其导出为未修饰。
也许这就是区别?
只需-Wl,--kill-at
在 gcc 命令行上使用,它将传递--kill-at
给链接器。
参考:
您还可以使用-Wl,--add-stdcall-alias
GCC 中的链接器选项。这将确保两个函数名称(装饰和未装饰)都存在并且可以用作别名。