我正在尝试构建一个项目,它有几个导出的函数。函数遵循stdcall约定,如果用GCC编译为
,它们会被破坏Func@X
其他编译器会破坏这样的名称:
_Func@X
有什么办法可以强制GCC将导出函数的名称变成后面的例子吗?
答案 0 :(得分:4)
请参阅this answer。
int Func() __asm__("_Func@X");
这将强制GCC将符号命名为_Func@X
,无论它通常做什么。
哦,对,@
很特别:它用于符号版本控制。我认为__asm__("...@...")
曾经工作过,但我想它已不复存在了。
int Func() __asm__("_Func");
__asm__(".symver _Func, _Func@X");
这必须附带version script文件,例如:
1 {
global:
_Func;
};
链接时给予gcc -Wl,--version-script=foo.version
。
答案 1 :(得分:0)
有关-fleading-underscore的信息,请参阅GCC手册。但是,请阅读有关此行动后果的警告;它可能不是你认为的解决方案。
答案 2 :(得分:0)
在Windows上处理函数名称修改时,最好的办法是始终使用.def
文件。无论编译器如何,这都将起作用。通常,您只需要EXPORTS
部分:
EXPORTS
Func1
Func2
...