我正在尝试构建一个我拥有的项目,它有几个导出的函数。这些函数遵循 stdcall 约定,如果使用 GCC 编译为
Func@X
其他编译器会像这样修改名称:
_Func@X
有什么办法可以强制 GCC 将导出函数的名称修改为后面的示例?
我正在尝试构建一个我拥有的项目,它有几个导出的函数。这些函数遵循 stdcall 约定,如果使用 GCC 编译为
Func@X
其他编译器会像这样修改名称:
_Func@X
有什么办法可以强制 GCC 将导出函数的名称修改为后面的示例?
看到这个答案。
int Func() __asm__("_Func@X");
这将强制 GCC 为符号命名,_Func@X
而不管它通常会做什么。
哦,对了,@
很特别:它用于符号版本控制。我以为这__asm__("...@...")
曾经有效,但我想现在不行了。
int Func() __asm__("_Func");
__asm__(".symver _Func, _Func@X");
这必须伴随一个版本脚本文件,例如:
1 {
global:
_Func;
};
链接时给予gcc -Wl,--version-script=foo.version
。
请参阅有关-fleading-underscore的 GCC 手册。但是,请阅读有关此操作后果的警告;它可能不是您认为的解决方案。
在 Windows 上处理函数名称修改时最好的选择是始终使用.def
文件。无论编译器如何,这都将起作用。通常您只需要以下EXPORTS
部分:
EXPORTS
Func1
Func2
...